鍊錶環的入口結點

2021-10-04 04:20:28 字數 1721 閱讀 1244

如果乙個鍊錶包含環,如何找出環的入口結點?單鏈表只有乙個指標域,所以環的話一定是後半部分成環或者是一整個。

關於這種鍊錶問題,一般都是可以用雙指標來解決。

首先考慮特殊情況,不是環(雙指標),鍊錶為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 判斷乙個煉表裡是否有環時用到了一快一慢兩個指標,如果兩個指標相遇,表明鍊錶中存在環。兩...