劍指offer 23 鍊錶中環的入口節點

2021-09-27 02:31:47 字數 1779 閱讀 3546

給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出none。

思路:1.找相遇點:設定乙個快指標pfast乙個慢指標pslow,先找到乙個相遇點,一定在環中

2.計算環的長度: 從相遇點出發,到相遇點結束-1,即為環的長度。

3.pfast:從phead+環的長度出發;pslow從phead出發,當pfast=pslow時,即為入口節點。

class listnode:

def __init__(self,x):

self.val = x

self.next = none

class solution:

def meetingnode(self,phead):

""":param phead:頭節點 0

:return:

"""if phead == none:

return none

pslow = phead.next #慢指標1,每次走一步

if pslow ==none:

return none

pfast = pslow.next# 快指標2,每次走兩步

while pfast:

if pslow == pfast: # 當兩個相等的時候返回慢指標的節點 即相遇點

return pslow

pslow = pslow.next

pfast = pfast.next

if pfast:

pfast = pfast.next

def entrynodeofloop(self,phead):

meetingnode = self.meetingnode(phead) #傳入相遇的點,以這個點為起點

if not meetingnode:

return none

nodeloop = 1 # 計步器從1開始 ,當next指標指向相遇點時結束。

flagnode = meetingnode

while flagnode.next != meetingnode:

nodeloop +=1

flagnode = flagnode.next

pfast = phead # 快指標從加上步長的位置開始

for i in range(nodeloop):

pfast = pfast.next

pslow = phead # 慢指標從頭開始

while pfast != pslow: # 當兩個相遇時,即入口節點

pfast = pfast.next

pslow = pslow.next

return pfast

node1 = listnode(1)

node2 = listnode(2)

node3 = listnode(3)

node4 = listnode(4)

node5 = listnode(5)

node6 = listnode(6)

node7 = listnode(7)

node1.next = node2

node2.next = node3

node3.next = node4

node4.next = node5

node5.next = node6

node6.next = node7

node7.next = node3

s = solution()

print(s.entrynodeofloop(node1).val)

劍指offer23 鍊錶中環的入口節點

給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。兩個指標,p1,p2 p1一次走一步,p2一次走兩步。第一次相遇之後開始計數,第二次再相遇時count的值就是環有多少個節點。兩個指標,p1,p2 p1先走count步,然後兩個再同時走,相遇的點就是入口節點。struct l...

劍指offer23 鍊錶中環的入口節點

判斷單鏈表中有沒有環,如果有找到環的入口節點。三個問題 1 如何確定鍊錶中包含環 兩個指標,乙個指標一次走一步,乙個指標一次走兩步。如果走得快的指標追上了走得慢的指標,則說明鍊錶包含環 如果走得快的指標走到了鍊錶末尾 p next null 都沒有追上第乙個指標,則無環。2 如何找到環的入口 定義兩...

劍指offer23 鍊錶中環的入口節點

題目 如果乙個鍊錶中包含環,如何找出環的入口節點?例如,在下圖所示的鍊錶中,環的入口節點是節點3。1 判斷乙個鍊錶是否包含環?可以用兩個指標來解決這個問題,定義乙個慢指標和乙個快指標,這兩個指標同時從鍊錶的頭節點出發,慢指標一次走一步,快指標一次走兩步,如果快指標追上了慢指標,說明鍊錶就包含環,如果...