判斷鍊錶中是否有環?
使用快慢指標, 慢指標一次走一步, 快指標一次走兩步, 當快慢指標相遇時,說明鍊錶存在環
為什麼快指標每次走兩步而慢指標每次走一步呢?
因為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了還沒返...