鍊錶環問題總結

2021-06-29 13:54:14 字數 1113 閱讀 5105

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

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

2、如何知道環的長度?

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

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

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

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

[cpp]view plain

copy

bool

i***itsloop(slist *head)  

return

!(fast == null || fast->next == null);  

}  

2、如何知道環的長度?

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

3、如何找出環的連線點(入口)在**?

設環的長度為r,鍊錶長度為l,節點相遇時slow走了s步,fast在環中轉了n圈,入口環與相遇點距離為x,起點到環入口點的距離為a。slow走一步,fast走兩步。

因此2s = nr + s

s = nr

s = a + x

l = a + r => r = l – a

a + x = nr

a = nr - x

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

[cpp]view plain

copy

slist* findloopport(slist *head)  

if(fast == null || fast->next == null)  

return

null;  

slow = head;  

while

(slow != fast)  

return

slow;  

}  

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

問題3中已經求出連線點距離頭指標的長度,加上問題2中求出的環的長度,二者之和就是帶環單鏈表的長度。

參考:

鍊錶 鍊錶環問題總結

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

鍊錶環問題總結

1.given a linked list,determine if it has a cycle in it.follow up can you solve it without using extra space?判斷乙個鍊錶是否有環 思路 通過定義乙個fast指標初始指向頭節點,每次走兩步 定...

鍊錶環問題

給定乙個鍊錶,判斷該鍊錶中是否有環?如果有的話,環的長度是多少?環的入口是哪個節點?使用快慢指標策略,兩個指標都從頭指標出發,快指標每次走兩步,慢指標每次走一步。1.判斷鍊錶是否有環?如果快慢節點相遇,那麼鍊錶有環。2.如果有環,環的長度是多少?快慢指標相遇後,固定其中乙個指標 如快指標 不動,另乙...