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

2021-07-10 19:33:24 字數 1320 閱讀 7356

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

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的距離,因此,分別從第一次碰撞點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.求有環單鏈表的環長 在環上相遇後,記錄第一次相遇點為pos,之...

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

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