找到帶環的單鏈表的入口點:
基本思路:
設定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...