求有環單鏈表中的環長 環起點 鍊錶長

2021-07-13 10:03:11 字數 1399 閱讀 9957

1.判斷單鏈表是否有環

使用兩個slow, fast指標從頭開始掃瞄鍊錶。指標slow 每次走1步,指標fast每次走2步。如果存在環,則指標slow、fast會相遇;如果不存在環,指標fast遇到null退出。

就是所謂的追擊相遇問題:

2.求有環單鏈表的環長

在環上相遇後,記錄第一次相遇點為pos,之後指標slow繼續每次走1步,fast每次走2步。在下次相遇的時候fast比slow正好又多走了一圈,也就是多走的距離等於環長。

設從第一次相遇到第二次相遇,設slow走了len步,則fast走了2*len步,相遇時多走了一圈:

環長=2*len-len。

3.求有環單鏈表的環連線點位置

第一次碰撞點pos到連線點join的距離=頭指標到連線點join的距離+n*環長,因此,分別從第一次碰撞點pos、頭指標head開始走,相遇的那個點就是連線點。

在環上相遇後,記錄第一次相遇點為pos,連線點為join,假設頭結點到連線點的長度為lena,連線點到第一次相遇點的長度為x,環長為r

第一次相遇時,slow走的長度 s =lena+x;

第一次相遇時,fast走的長度 2s =lena+ n*r+x;

所以可以知道,lena+x =n*r;lena = n*r -x;

4.求有環單鏈表的鍊錶長

上述2中求出了環的長度;3中求出了連線點的位置,就可以求出頭結點到連線點的長度。兩者相加就是鍊錶的長度。

程式設計實現:

下面是**中的例子:

具體**如下:

執行結果:

求有環單鏈表中的環長 環起點 鍊錶長

1.判斷單鏈表是否有環 使用兩個slow,fast指標從頭開始掃瞄鍊錶。指標slow 每次走1步,指標fast每次走2步。如果存在環,則指標slow fast會相遇 如果不存在環,指標fast遇到null退出。就是所謂的追擊相遇問題 2.求有環單鏈表的環長 在環上相遇後,記錄第一次相遇點為pos,之...

求有環單鏈表中的環長 環起點 鍊錶長

求有環單鏈表中的環長 環起點 鍊錶長 1.判斷單鏈表是否有環 使用兩個slow,fast指標從頭開始掃瞄鍊錶。指標slow 每次走1步,指標fast每次走2步。如果存在環,則指標slow fast會相遇 如果不存在環,指標fast遇到null退出。就是所謂的追擊相遇問題 2.求有環單鏈表的環長 在環...

求有環單鏈表中的環長 環起點 鍊錶長

1.判斷單鏈表是否有環 使用兩個slow,fast指標從頭開始掃瞄鍊錶。指標slow 每次走1步,指標fast每次走2步。如果存在環,則指標slow fast會相遇 如果不存在環,指標fast遇到null退出。就是所謂的追擊相遇問題 2.求有環單鏈表的環長 在環上相遇後,記錄第一次相遇點為pos,之...