判斷單鏈列表是否存在環,即某個節點的next指向鍊錶中在它前面的節點,這樣在鍊錶尾部形成一環。
1.判斷是否存在環
用乙個fast指標,乙個slow指標,slow每次移動1,fast每次移動2.
若鍊錶存在環,移動快的fast指標一定在環內追趕上移動慢的slow指標,則相遇
2.找到環的入口
當兩指標第一次相遇後,證明存在環。現在將fast指標重新設為head,slow指標不變。
接下來fast和slow都每次移動1。兩指標在此相遇的位置即為環的入口。
證明:設初次相遇時迴圈執行n次。設初次相遇為m點,head到環入口距離為a,環入口到m點距離為b。環路周長為l。第一次相遇時fast已經走了k圈(不能保證相遇時fast只多走1圈)。
slow走的距離為d1 = a + b = n
fast走的距離為d2 = a + b+ k*l = 2n
d2 - d1 = n = k*l,可只長度n恰好為環周長的整數倍。
此時slow從相遇點m再走n步,可以回到相遇點m。
此時fast從head出發走n步,也可到達m。
實際上兩者在走完a步後就相遇了,此處即為環的入口。
# python**:
slow = fast = head
while true:
if not fast.next or not fast.next.next:
# no loop
return none
else:
slow = slow.next
fast = fast.next.next
if slow == fast:
break
# encountered for 1st time. now set out again
while fast != slow:
fast = fast.next
slow = slow.next
# now both fast and slow point to the loop entrance
return fast
應用:
可以用來解決兩個單鏈表是否存在交點的問題,如下
a: a1 → a2↘c1 → c2 → c3
↗
b: b1 → b2 → b3
可以先遍歷a找到尾節點taila,設定taila.next = headb。若a與b有交點,則從heada再出發可以找到乙個環,環路入口即為鍊錶交點。
單鏈表 判斷單鏈表L是否是遞增的(雙指標法)
單鏈表的儲存結構 typedef struct linklist 分析 定義乙個指標p夠不夠用?你要判斷是否遞增,說明要比較前後兩節點的資料域。如果前者一直大於後者,那麼可判斷該單鏈表遞增。所以這裡要定義兩個指標,pre p.思路 1.定義兩個前後指標pre p,並pre開始指向頭結點 2.通過wh...
leetcode 392 判斷s是否是t的子串行
class solution def issubsequence self,s str,t str bool s is much smaller than t i,j 0,0 while i len s 1 and j len t 1 if s i t j i 1 j 1 else j 1 if i...
如何判斷乙個單鏈表是迴圈鍊錶
1.迴圈鍊錶的特點是收尾相接,沒有頭指標,也沒有尾指標。如果去遍歷迴圈鍊錶,則是死迴圈。2.這裡判斷迴圈鍊錶的方法是 用兩個指標,乙個指標是塊指標 跳乙個節點遍歷 遍歷快 p p netxt next 乙個指標逐步遍歷,慢指標。如果在遍歷當中,如果發現這兩個指標有可能是出現null指標的話,那邊它是...