判斷乙個單鏈表是否有環及環的鏈結點

2021-06-27 00:37:45 字數 1408 閱讀 2260

給定乙個單鏈表,只給出頭指標h:

1、如何判斷是否存在環?

2、如何知道環的長度?

3、如何找出環的連線點在**?

4、帶環鍊錶的長度是多少?

1、對於問題1,使用追趕的方法,設定兩個指標ps、pf,從頭指標開始,每次分別前進1步、2步。如存在環,則兩者相遇;如不存在環,pf遇到null退出。

證明:如果存在環,則他倆一定在環中相遇。

設i是走的步數,n是環的長度,

從ps走進環裡開始計算,此時pf應當有乙個相距於ps的距離,設為y。

假設走了i步他倆相遇,

此時ps相對於環開始節點的距離是i步,pf是y+2i步。

相遇時快指標多走了一圈 (y+2i)-i= n => y+i=n =>i=n-y

所以,追上的步數i取決於進入環時y的值。y是1的時候,是追的最費勁的,需要n-1步;y是n-1的時候最容易追,1步就追上了。

boolean has_loop(node *head) 

}

2、對於問題2,記錄下問題1的碰撞點p,ps、pf從該點開始,再次碰撞所走過的運算元就是環的長度n。

證明:上面的公式i=n-y,當y=0時,就是第一次相遇時開始走,i=n。

/* step 2, how long is the loop */

int i = 0;

do while(ps!=pf)

3.假設單鏈表的總長度為l

,頭結點到環入口的距離為a,環入口到快慢指標相遇的結點距離為x,環的長度為n,慢指標總共走了s步,則快指標走了2s步。另外,快指標要追上慢指標的話快指標至少要在環裡面轉了一圈多(假設轉了n圈加x

的距離),得到以下關係:

s = a + x;

2s = a + nr + x;

=>a + x = nr;

=>x = nr - a;

逆時針方向走,pf還需要走的距離是y,

y+x=tn

=>y+nr-a=tn=>y=(t-r)n+a//y的距離就是a又加了幾圈

由上式可知:若在頭結點和相遇結點分別設一指標,同步(單步)前進,則最後一定相遇在環入口結點,搞掂!

}4. 將2和3的長度相加就是鍊錶的長度。

判斷乙個單鏈表是否有環及環

判斷乙個單鏈表是否有環及環的鏈結點 蒙恩的罪人 給定乙個單鏈表,只給出頭指標h 1 如何判斷是否存在環?2 如何知道環的長度?3 如何找出環的連線點在 4 帶環鍊錶的長度是多少?解法 1 對於問題1,使用追趕的方法,設定兩個指標slow fast,從頭指標開始,每次分別前進1步 2步。如存在環,則兩...

判斷乙個單鏈表是否有環及環入口

要求 不允許修改鍊錶結構 時間複雜度o n 空間複雜度o 1 判斷是否有環 如果鍊錶有環,那麼在遍歷時則會陷入死迴圈。使用快慢指標 快指標移動2步,慢指標移動1步 如果走到某一步,快慢指標相遇,則說明有環 環入口點 我們假設鍊錶頭部到環入口距離 len,環入口到快慢指標交匯點的距離為x,環的長度為r...

判斷乙個單鏈表是否有環

一 判斷鍊錶是否存在環 設定兩個指標 fast,slow 初始值都指向頭,slow每次前進一步,fast每次前進二步,如果鍊錶存在環,則fast必定先進入 環,而slow後進入環,兩個指標必定相遇。當然,fast先行頭到尾部為null,則為無環鏈表 程式如下 bool i itsloop listn...