如果乙個鍊錶包含環,如何找出環的入口結點?單鏈表只有乙個指標域,所以環的話一定是後半部分成環或者是一整個。
關於這種鍊錶問題,一般都是可以用雙指標來解決。
首先考慮特殊情況,不是環(雙指標),鍊錶為none。
1.通過pre和latter兩個指標,同時走,pre的速度是latter的兩倍,如果pre小於等於latter,說明有環。
2.二是判斷入口的結點,可以通過先計算出環的結點數目n,然後讓pre先走n步,接著兩者一起走,當pre=latter,此時就是結點。乙個已經走完了環,乙個剛到環的結點,相遇。
3.計算結點的數目,如第一步所示,在兩者相遇之後,乙個不動,另外乙個移動,直到再次相遇,每走一步+1,算出結點的數目。
沒有驗證過正確性。僅提供思路。
class
solution()
:def
meet
(self, head)
: pre =
0 latter =
0 phead1 = head
phead2 = head
phead2 = phead2.
next
while phead2 != phead1:
if phead2.
next
.next
!=none
: phead2 = phead2.
next
.next
pre +=
2if phead1.
next
!=none
: phead1 = phead1.
next
latter +=
1if phead2.
next
.next
==none
:return
false
return phead1
defnodenumber
(self, head)
: phead2 = self.meet(head)
phead3 = phead2
phead3 = phead3.
next
a =1while phead3 != phead2:
phead3 = phead3.
next
a +=
1return a
defentrance
(self, head):if
not head:
return
if head.
next
==none
:return
if self.meet(head)
: a = self.nodenumber(head)
phead1 = head
phead2 = head
for i in
range(0
, a)
: phead1 = phead1.
next
while phead1 != phead2:
phead1 = phead1.
next
phead2 = phead2.
next
return phead1
return
鍊錶的環的入口結點
乙個鍊錶中包含環,請找出該鍊錶的環的入口結點。struct listnode 資料快慢指標 判斷是否有環就不解釋了,下面主要解釋,為什麼可以那樣找環入口。a b c 只是個簡單圖,就不專門做圖了,湊合表示下吧。也就是a的位置是頭節點,b表示環入口處,c表示快慢指標第一次相遇處。在c處相遇時,設慢指標...
鍊錶中的環的入口結點
學習內容 鍊錶中的環的入口結點 1 思路 如果鍊錶是乙個空鍊錶,或者只有乙個結點的鍊錶,答案是null。如果鍊錶是至少有兩個結點的線性鍊錶,那麼答案也是null。如果鍊錶包含環,那麼入口結點的位址一定出現且僅出現兩次。特別情況就是整個鍊錶是個環,那麼入口結點是這個單鏈表的第乙個結點。要找到整個鍊錶中...
8 找出鍊錶環的入口結點
給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。struct listnode class solution 鍊錶中有環的解釋 參考 上圖中的第二個示例圖p2改為p1。環中結點的數目 1 判斷乙個煉表裡是否有環時用到了一快一慢兩個指標,如果兩個指標相遇,表明鍊錶中存在環。兩...