快慢指標判斷鍊錶中是否存在環 查詢環的起始位置

2021-10-18 17:46:56 字數 1426 閱讀 9162

判斷鍊錶中是否有環?

使用快慢指標, 慢指標一次走一步, 快指標一次走兩步, 當快慢指標相遇時,說明鍊錶存在環

為什麼快指標每次走兩步而慢指標每次走一步呢?

因為slow指標和fast指標都會進入環內, 就像在環形跑道內不同位置的兩個人;slow指標在後面,

fast指標在前面, 但實際上fast指標也在追slow指標, 希望能在環內超slow指標一圈(當超過一圈時會

相遇)。那麼fast指標總會追上slow指標的;

那麼fast指標會不會跳過slow指標呢(為什麼快慢指標的步驟差必須為1呢)?

不會的, 因為fast每次走2步,slow每次走1步,假設兩者在環內的距離差為n, 那麼每次走動, 距離差n都

會縮小一步, 因為fast與slow指標的步長差是1(1也是fast與slow指標之間距離的最小單位);最終,n會減少到0,

也就是兩者會相遇。如果fast指標每次走兩步,那麼當fast與slow間只剩一步時, fast指標會錯過slow指標;

如何查詢鍊錶環的起始位置?

假設slow指標和fast指標從a點出發, 最終在c點相遇, 那麼可以判斷鍊錶中存在環; 此時slow指標移動距離為l1+l2,fast指標移動距離為: l1+l2 + l3+l2;

由於fast指標速度是slow指標的2倍, 那麼如果slow指標移動的距離為s, 那fast指標移動的記錄就是2s, 所以2 * (l1+l2) = l1+l2+l3+l2, 因此可以得出:l1 == l3

那麼如果將fast指標置於c點, slow指標置於a點, 這次以相同的速度移動, 當兩個指標再次相遇時, 就是環的起始位置b點

slow = head //快慢指標都指向頭部

do while 快慢指標不相等時

if 指標都為空時

while 快慢指標不相等時

return fast

快慢指標判斷鍊錶是否有環

關於鍊錶是否有環,其實是一系列問題,主要包括以下幾個 使用快慢指標fast和slow,fast每次走兩步,slow每次走一步,如果有環,肯定會相遇,如果沒有,則指標fast遇到null退出。追及相遇問題。在環上相遇後,記錄第一次相遇點為pos,之後指標slow繼續每次走1步,fast每次走2步。在下...

雙指標(快慢指標)判斷鍊錶是否有環

單鏈表的特點是每個節點知道下乙個節點 如果用乙個指標來判斷是否有環,當沒有環時,指標一直會指到鍊錶的為即指到null,但是當有環時,指標將陷入死迴圈,因為環形鍊錶中沒有null指標作為尾部節點 while head null head head.next return false 找到一種經典解法 ...

使用快慢指標判斷鍊錶是否有環

今天做到leetcode 141 linked list cycle,判斷鍊錶是否存在環,因為看到題目中的val都是整數,所以我是將每個node用1.1作為值去mark了,如果head.next的val是1.1,就說明我指向的下個結點已經走過了,這就是乙個環,如果走到最後head走到none了還沒返...