1、實現單鏈表逆置
無頭結點:
1#include 2
#include 3
4typedef
struct
nodenode;8
9//建立鍊錶
10node*createlist(
void)
28p->next=null;
29return
head;30}
31 32//鍊錶的逆置
33node*reverselist(node*head)
43return
r;44}45
46//輸出鍊錶
47void
showlist(node*head)
54printf(
"\n");55}
56 57void
main()
2、判斷單鏈表是否有環
判斷鍊錶是否存在環的辦法為:
設定兩個指標(fast,slow)
,初始值都指向頭指標,
slow
每次前進一步,
fast
每次前進兩步,如果鍊錶存在環,則
fast
必定先進入環,而
slow
後進入環,兩個指標必定相遇。(當然,
fast
先行從頭到尾部為
null
,則為無環鏈表)程式如下: 1
#include 2
#include 3
4typedef
struct
nodenode,*nodelist;8
9bool
i***itsloop(nodelisthead)
17return
!(fast==null||fast->next==null);18}
19 20void
main()
32p=(nodelist)malloc(
sizeof(node));
33p->elem=
6;34
q->next=p;
35q=p;
36q->next=head->next->next->next;
37//判斷單鏈表是否存在環
38printf(
"單鏈表是否存在環
:");
39bool
b=i***itsloop(head);
40printf(
"%s\n"
,b==
false
?"false"
:"true");41}
3、如果單鏈表有環,則找到環的入口點
當fast
若與slow
相遇時,
slow
肯定沒有遍歷完鍊錶,而
fast
已經在環內迴圈了n圈(
1<=n
),假設
slow走了s
步,而fast
走了2s
步(fast
步數還等於
s加上在環上多轉的
n圈),設環長為
r,則:
2s=s+n*r;
s=n*r;
設整個鍊錶長為l
,入口環與相遇點距離為
x,起點到環入口點的距離為a。
a+x=n*r;
a+x=(n-1)*r+r=(n-1)*r+l-a;
a=(n-1)r+(l–a–
x);(l–a–
x)為相遇點到環入口點的距離,由此可知,從煉表頭到環入口點等於
(n-1)
迴圈內環
+相遇點到環入口點,於是我們從煉表頭、與相遇點分別設乙個指標,每次各走一步,兩個指標必定相遇,且相遇第一點為環入口點。程式描述如下: 1
#include 2
#include 3
4typedef
struct
nodenode,*nodelist;8
9//尋找環的入口點
10nodelistfindloopport(nodelisthead)
18if
(fast==null||fast->next==null)
19return
null;
20slow=head;
21while
(slow!=fast)
25return
slow;26}
27 28void
main()
40p=(nodelist)malloc(
sizeof(node));
41p->elem=
6;42
q->next=p;
43q=p;
44q->next=head->next->next->next;
45//尋找環的入口點
46nodelistlist=findloopport(head);
47printf(
"環的入口節點元素值為:
%d\n"
,list->elem);48}
4、判斷兩個單鏈表是否相交,如果相交,給出相交的第乙個點(兩個鍊錶都不存在環)
比較好的方法有兩個:
一、將其中乙個鍊錶首尾相連,檢測另外乙個鍊錶是否存在環,如果存在,則兩個鍊錶相交,而檢測出來的依賴環入口即為相交的第乙個點。
二、如果兩個鍊錶相交,那麼兩個鍊錶從相交點到鍊錶結束都是相同的節點,我們可以先遍歷乙個鍊錶,直到尾部,再遍歷另外乙個鍊錶,如果也可以走到同樣的結尾點,則兩個鍊錶相交。這時我們記下兩個鍊錶length
,再遍歷一次,長鍊表節點先出發前進
(lengthmax-lengthmin)
步,之後兩個鍊錶同時前進,每次一步,相遇的第一點即為兩個鍊錶相交的第乙個點。
面試中常見鍊錶問題3 旋轉鍊錶
給定乙個單鏈表和乙個k值,把鍊錶向右旋轉k步,比如說1 2 3 4 5 null和k 2,則返回4 5 1 2 3 null。解析 1 把鍊錶分割成兩部分,前半部的長度為len k,後半部分的長度為k,其中len為鍊錶測長度。2 把後一部分鍊錶的尾指標指向前一部分鍊錶的頭指標。返回後一部分的首指標即...
鍊錶 鍊錶常見筆試題和面試題 C語言
本文為鍊錶常見的筆試題和面試題,包含鍊錶反轉 判斷鍊錶是否有環 查詢環形入口 查詢公共結點 合併兩個有序鍊錶 查詢倒數第k個結點 查詢中間結點 刪除有序鍊錶重複結點。node list reverse node head node p head node q head next node r q n...
面試中常見鍊錶問題1 合併兩個有序鍊錶
給定兩個有序鍊錶,把這兩個鍊錶合併為乙個有序鍊錶。比如鍊錶1 3 5 null和鍊錶2 4 6 null。合併以後為1 2 3 4 5 6 null。方法一 迴圈迭代方法listnode mergetwolists listnode l1,listnode l2 else p p next if l...