#ifndef _linklist_h__
#define _linklist_h__
#define _crt_secure_no_warnings
#include
#include
#include
<
string
.h>
#include
typedef int datatype;
typedef struct node
node,*pnode,*plist;
void initlist(plist* pplist);
//尾插法
void pushback(plist* pplist);
//排序
void bubblesort(plist* pplist);
//列印單向鍊錶
void reverseprint(plist plist);
//刪除無頭單鏈表的非尾結點
void erasenottail(pnode pos);
//在無頭單鏈表的非頭結點前插入乙個元素
void insertfrontnode(pnode pos, datatype x);
//約瑟夫環問題
void josephcycle(plist* pplist, int k);
//逆序單向鍊錶
void reverselist(plist* pplist);
//合併兩個有序列表
plist merge(const plist* p1, const plist* p2);
//查詢單鏈表的中間節點,要求只能遍歷一次鍊錶
pnode findmidnode(plist plist);
//查詢單鏈表的倒數第k個節點,要求只能遍歷一次鍊錶
pnode findknode(plist plist, int k);
//判斷鍊錶時候帶環
pnode checkcircle(plist plist);
//求環的長度
int getcirclelength(pnode meet);
//求環的入口點
pnode getcycleentrynode(plist plist, pnode meet);
//判斷兩條單項鍊表時候相交
int checkcross(plist list1, plist list2);
//求交點
pnode getcrossnode(plist list1, plist list2);
#endif
#define _crt_secure_no_warnings
#include
"linklist.h"
pnode buynode(datatype x)
tmp->
data
= x;
tmp->next =
null;
return tmp;
}void initlist(plist* pplist)
//尾插法
void pushback(plist* pplist,datatype x)
else
cur->next = newnode;
}}//排序
void bubblesort(plist* pplist)
while (cur != tail)
cur = cur->next;
}tail = cur;
cur =
*pplist;
}}//列印單向鍊錶
void display(plist plist)
printf("end\n");
}//查詢x所在的節點
pnode find(plist pplist,datatype x)
else
cur = cur->next;
}return
null;
}}//刪除無頭單鏈表的非尾結點
void erasenottail(pnode pos)
//在無頭單鏈表的非頭結點前插入乙個元素
void insertfrontnode(pnode pos, datatype x)
//約瑟夫環問題
void josephcycle(plist* pplist, int k)
//逆序單向鍊錶
void reverselist(plist* pplist)
*pplist = p;
}//合併兩個有序列表 非遞迴
plist merge(const plist* p1, const plist* p2)
//乙個為空,乙個非空
if ((*p1 ==
null) && (*p2 !=
null))
if ((*p2 ==
null) && (*p1 !=
null))
//2個都不為空
if (cur1->
data
< cur2->
data)
else
cur = newnode;
while (cur1&&cur2)
else
}if (cur1 ==
null)
else
return newnode;
}//查詢單鏈表的中間節點,要求只能遍歷一次鍊錶
pnode findmidnode(plist plist)
else
return slow;
}}//查詢單鏈表的倒數第k個節點,要求只能遍歷一次鍊錶
pnode findknode(plist plist, int k)
int i =
0; for (i; i < k-
1; i++)
}fast = fast->next;
while (fast)
return slow;
}//判斷鍊錶是否帶環
pnode checkcircle(plist plist)
else
}return
null;
}}//求環的長度
int getcirclelength(pnode meet)
while (cur!=meet);
return count;
}//求環的入口點
pnode getcycleentrynode(plist plist, pnode meet)
//判斷兩條單項鍊表時候相交
int checkcross(plist list1, plist list2)
while (cur1->next)
while (cur2->next)
if (cur1 == cur2)
return0;}
//求交點
pnode getcrossnode(plist list1, plist list2)
while (cur2->next)
int diff = abs(len2 - len1);
if (len1 > len2)
else
for (int i =
0; i < diff; i++)
while (cur1 != cur2)
return cur1;
}#define _crt_secure_no_warnings
#include
"linklist.h"
void test1()
void test2()
void test3()
void test4()
void test5()
void test6()
void test7()
else
c = getcrossnode(s1, s2);
printf("%d\n", c->
data);
}int main()
單鏈表常見面試題
一 獲取單鏈表的節點個數 思路 遍歷鍊錶 head 煉表頭結點 param head return 方法 獲取到單鏈表結點的個數 如果是帶頭結點的鍊錶,不統計頭結點 public static int getlength heronode head int length 0 定義乙個輔助變數,沒有統...
單鏈表的常見面試題
單鏈表的基礎操作 單鏈表建立面試題 1.從尾到頭列印單鏈表 2.刪除乙個無頭單鏈表的非尾節點 不能遍歷鍊錶 3.在無頭單鏈表的乙個非頭節點前插入乙個節點 不能遍歷鍊錶 4.單鏈表實現約瑟夫環 josephcircle 5.逆置 反轉單鏈表 6.查詢單鏈表的中間節點,要求只能遍歷一次鍊錶 void p...
單鏈表常見面試題及答案
一 單鏈表結點的刪除 0 刪除單鏈表p指向的那個元素,時間和空間複雜度盡量小 二 單鏈表的訪問 1 找出單鏈表的倒數第k個元素,僅允許遍歷一遍鍊錶 2 找出單鏈表的中間元素,僅允許遍歷一遍鍊錶 三 單鏈表與環的問題 3 判斷單鏈表是否有環 6形狀 4 如何找到環的入口?5 如何知道環的長度?6 帶環...