判斷單鏈表中有沒有環,如果有找到環的入口節點。
三個問題:
1、如何確定鍊錶中包含環:兩個指標,乙個指標一次走一步,乙個指標一次走兩步。如果走得快的指標追上了走得慢的指標,則說明鍊錶包含環; 如果走得快的指標走到了鍊錶末尾(p->next == null)都沒有追上第乙個指標,則無環。
2、如何找到環的入口:定義兩個指標p1,p2指向頭結點,如果環有n個結點, 則p1先移動n步,然後兩個指標以相同的速度向前移動。當p2指向環的入口節點時,p1已經圍繞著環走了一圈又回到了入口節點。
3、如何得到環中節點數目:1中相遇的兩個指標指向的結點一定在環中,可以從這個節點出發,一邊繼續移動一邊計數,當再次回到這個節點時,就可以得到環中節點數了。
//判斷鍊錶內是否包含環
//找到快慢指標相遇的節點,此節點必定在環內
listnode* meetingnode(listnode* head)
return null:
}//得出環中節點數目,並找到環的入口節點
listnode* entrynodeofloop(listnode* head)
m = head;
for(int i=0; inext;
} listnode* n = head;
while(m != n)
return m;
}
劍指offer23 鍊錶中環的入口節點
給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出null。兩個指標,p1,p2 p1一次走一步,p2一次走兩步。第一次相遇之後開始計數,第二次再相遇時count的值就是環有多少個節點。兩個指標,p1,p2 p1先走count步,然後兩個再同時走,相遇的點就是入口節點。struct l...
劍指offer 23 鍊錶中環的入口節點
給乙個鍊錶,若其中包含環,請找出該鍊錶的環的入口結點,否則,輸出none。思路 1.找相遇點 設定乙個快指標pfast乙個慢指標pslow,先找到乙個相遇點,一定在環中 2.計算環的長度 從相遇點出發,到相遇點結束 1,即為環的長度。3.pfast 從phead 環的長度出發 pslow從phead...
劍指offer23 鍊錶中環的入口節點
題目 如果乙個鍊錶中包含環,如何找出環的入口節點?例如,在下圖所示的鍊錶中,環的入口節點是節點3。1 判斷乙個鍊錶是否包含環?可以用兩個指標來解決這個問題,定義乙個慢指標和乙個快指標,這兩個指標同時從鍊錶的頭節點出發,慢指標一次走一步,快指標一次走兩步,如果快指標追上了慢指標,說明鍊錶就包含環,如果...