判斷單鏈表是否有環

2021-10-11 16:22:01 字數 1190 閱讀 2031

找到帶環的單鏈表的入口點:

基本思路:

設定slow和fast指標,分別從head處開始移動,slow移動1步,fast移動2步直到兩個指標相遇(如果不能相遇就是沒有沒有環),如圖所示,x為相遇點到環的入口的距離,a為單鏈表長度

如上圖,在slow指標到達x處時fast已經圍繞環移動了n圈(設每圈周長為r)則fast移動的距離為a+n*r+x,此時slow一定還在第一圈的範圍內(證:如果兩者同時從環入口處出發,fast的速度是slow的二倍,則fast和slow第一次會在fast經過兩圈,slow完成一圈的時候在入口處相遇,但這是單鏈表長度為0的情況,也是上圖中相遇最晚的情況),所以slow移動的距離為a+x,可以得到:

a+n*r+x=2*(a+x)(fast的距離是slow的兩倍)=>a=n*r-x=(n-1)*r+(r-x)

經過上式即可知,從單鏈表頭和x處同時前進的節點將會在一點相遇,該點即為環的入口((證:從x出發經過r-x到達入口,再走n-1圈仍在入口,從head出發經過a也到達入口)),此時head出發的指標走了a,x出發的指標走了(n-1)*r+(r-x)。

c語言實現演算法:

void

main()

//開始移動fast和slow指標,找到fast和slow的相遇點

linklist *slow=head1->next->next,

*fast=slow->next,

*meet;

while

(slow!=fast)

printf

("\nfast和slow相遇點:%d"

,slow->it)

;//從相遇點和單鏈表起點開始同時前進直到相遇就是迴圈鍊錶入口

meet=slow;

cur=head1->next;

while

(meet!=cur)

printf

("\n入口點: %d"

,cur->it)

;}

判斷單鏈表是否有環

1 如何判斷乙個鍊錶是不是這類鍊錶?2 如果鍊錶為存在環,如果找到環的入口點?解答 一 判斷鍊錶是否存在環,辦法為 設定兩個指標 fast,slow 初始值都指向頭,slow每次前進一步,fast每次前進二步,如果鍊錶存在環,則fast必定先進入環,而slow後進入環,兩個指標必定相遇。當然,fas...

判斷單鏈表是否有環

鍊錶結構 struct list 1 判斷單鏈表是否有環 採用追趕法,設定兩個指標p和q,從煉表表頭開始,p每一步走兩個節點,q每一步走乙個節點,如果鍊錶有環則p和q必相遇。如下 判斷鍊錶是否有環,時間複雜度o n 空間複雜度o 1 list hasloopinlist list head else...

判斷單鏈表是否有環

1 如何判斷乙個鍊錶是不是這類鍊錶?2 如果鍊錶為存在環,如果找到環的入口點?解答 一 判斷鍊錶是否存在環,辦法為 設定兩個指標 fast,slow 初始值都指向頭,slow每次前進一步,fast每次前進二步,如果鍊錶存在環,則fast必定先進入環,而slow後進入環,兩個指標必定相遇。當然,fas...