單鏈表有環 及重要的快慢指標思想
阿新 • • 發佈:2018-12-21
判斷單鏈表有環的基本思路:設定快慢指標slow fast,
若有環,則二者一定會相遇,若沒有環,則快指標先到達連結串列末尾
證明思路:若有環,則當slow進入環的時候,fast必定已經在環中
此時設fast位置為0,slow位置為k 則
若在k+m位置相遇,相當於slow指標往前走了m步。則2m=m+k 解得m=k.
可以這樣理解,由於現在slow在fast前k個位置,而slow每次走一步,fast每次走兩步。每次兩者之間距離減少1.故走過slow往前走了k步以後兩者必然相遇。
bool isExitLoop(LNode *head) { LNode *slow=head,*fast=head; while(fast && fast->next) { slow=slow->next; fast=fast->next->next; if(fast==slow) break; } return !(fast==NULL || fast->next==NULL) //()中內容說明不是迴圈連結串列。 }
該問題的拓展:
1.如何知道環的長度?:記錄下碰撞點的位置,再次碰撞走過的步數即為環的長度
2.如何找出環的連線點在哪? (設環的周長為R)
可列公式: 設在pos位置相遇,第一次相遇時
S=lenA+x
2S=lenA+n*R+x
3.帶環連結串列的長度是多少?
其他問題的拓展
4.如何尋找連結串列中倒數第k個結點的位置?快慢指標,快指標提前走k個位置
5.尋找連結串列的中間結點?快慢指標,快指標一次走兩步,慢指標一次
走一步。