求解單鏈錶環入口點的步驟:
1:使用「指標追趕」方法找到相遇點(網上資料很多,此處略)。
2:指標p1從煉表頭、p2從相遇點,同時出發,一次移動乙個節點,再次的相遇點便是環的入口點。
理解了好久,終於證明了為什麼步驟2那樣就能找到入口點。
證明導向:p1從表頭走,能與p2從相遇點走再次相遇,那麼說明p1走到入口點時,p2可能剛好走了y-d(其中d是入口點與第一次相遇點的距離)個節點,或者走了幾圈再加上y-d個節點。故就要找到y-d與x的關係。
第一次相遇:s慢:表示一次移動乙個節點的指標所走的路程(即節點個數)
s快:表示一次移動兩個節點的指標所走的路程(節點個數)
s慢= x + d
s快= 2(x + d)
s快- s慢 = n倍y
則有:x+ d = ny
x= ny - d = (n - 1)y + (y - d)
由此便說明了:x個節點就相當於(n - 1)倍環周長加上y - d,正好是第一次相遇點到入口點的距離。
如何找到帶環鍊錶的入口節點?
2種思路 首先我們假設有個帶環鍊錶list1,如圖我們可以這麼做 這樣問題就轉換成了如何求出2個不帶環鍊錶的相交節點 很明顯你會問如何在環中找到乙個節點,你不可能去遍歷 會死迴圈 有這樣乙個辦法,我們設定乙個快慢指標first,second,快指標一次走2個節點,慢指標一次走乙個節點,那麼它們最終在...
判斷鍊錶是否帶環,以及環的入口
給出乙個鍊錶,先判斷鍊錶是否帶環,如果帶環,求出環的入口。判斷是否帶環 用快慢指標。快指標每走兩步,慢指標走一步,如果兩者在某個點處相 遇,則鍊錶帶環。下邊給出函式的實現 typedef struct linknode linknode,plinknode typedef struct linkli...
找出帶環單向鍊錶的環入口(交點)
其實這個問題已經被問爛了,但是之前沒有想透,今天算是解決得差不多。找環的入口這個問題,其實是建立在另外乙個問題之上的 判斷單向鍊錶是否有環 土方法很多,但是比較好的目前就那麼乙個 一開始設定兩個指標都指向表頭,其中乙個每次 一步 前進乙個節點的叫p1,另外那個每次 一步 前進兩個節點的叫p2 p1和...