給定乙個單鏈表,只給出頭指標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.如果有環,環的長度是多少?快慢指標相遇後,固定其中乙個指標 如快指標 不動,另乙...