題目:如果鍊錶中存在環,則找出環的入口節點,如下圖,環的入口為節點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指...