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

2021-09-05 11:43:06 字數 1213 閱讀 4642

題目:如果鍊錶中存在環,則找出環的入口節點,如下圖,環的入口為節點3

首先要想辦法確認鍊錶中是否有環。鍊錶中有環表明鍊錶中沒有尾節點,因此遍歷的時候會一直迴圈下去永不停止。用乙個指標的話很難確認表中是否有環。

因此我們嘗試用兩個指標,讓乙個指標走快一點,乙個指標走慢一點,當兩個指標指向的節點一樣時,可以確認鍊錶中一定有環。否則如果當走得快的那個指標已經到尾節點,鍊錶肯定就沒有環了。

之後嘗試確認環的入口,由圖可以看出對於環入口,其是環的第乙個元素,環的前乙個元素在環之外。我們依然可以用兩個指標,如果第乙個指標先往前走環的長度n步,然後兩個節點再以一樣速度移動,那麼當兩個節點第一次重合時,即是環的入口。

如上圖,環的長度為4,第乙個指標從節點1開始前進4步到節點5,然後第二個指標從節點1開始,兩個指標各走前進兩個節點後在節點3中重合,因此節點3為環的入口。

因此問題的關鍵在於想辦法算出環的節點數,這個並不太難。在環中一直向前走,走了a步後返回原節點,即可確認節點長度為a。

以下為實現**

listnode*

entrynodeinlistloop

(linklist a)

if(n2==

nullptr

)return

nullptr

;//函式到此處仍未返回,證明表中有環

//確認環的長度

int len =1;

n2 = n2-

>next;

while

(n1!=n2)

//將兩個指標重設為頭指標,n2先走len步,然後再一起走

//當兩個指標重合,則該處為環入口

n1 = a; n2 = a;

for(

int i =

0; i < len;

++i) n2 = n2-

>next;

while

(n1!=n2)

return n1;

}

演算法的完整**在這裡

本題難度在於不能一步獲得結果,需要把問題分成

而每乙個子問題的解法都不太難。

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

1.如果鍊錶中有環,可以通過快慢指標,最後快慢指標肯定會相會於環中的某個節點 2.從這個相會的節點開始,當再次遇到該節點,即可統計環中有節點數 n 3.設定兩個指標p,p1,p從頭先走 n 步,p1在頭部,然後兩個指標同時 走,當兩指標相遇時,相遇的節點即是環的入口。c struct listnod...

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

判斷鍊錶中是否有環lo w fa stslow fast 均從頭指標開始,每次分別前進1步 2步。如存在環,則兩者相遇 如不存在環,fas tfast 遇到null null 退出。low fas tslow fast 均從頭指標開始,每次分別前進1步 2步。如存在環,則兩者相遇 如不存在環,fas...

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

題目描述 給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。快慢指標追趕問題 定義快慢指標 快指標每次走兩步,慢指標每次走一步 fast fast next next slow slow next 這樣的話,如果鍊錶存在環,那麼fast指標比slow指標先入環 並且slow指...