1. 程式人生 > >單鏈表有環 及重要的快慢指標思想

單鏈表有環 及重要的快慢指標思想

判斷單鏈表有環的基本思路:設定快慢指標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.尋找連結串列的中間結點?快慢指標,快指標一次走兩步,慢指標一次

走一步。