題目:如本文題目,給定乙個帶環的單鏈表,給出乙個演算法求煉錶環的入口位置處的節點。
解析:這題的解決步驟如下:
1.設定乙個快指標fast和乙個慢指標slow,它們同時從煉表頭開始往後遍歷,快指標每次移動兩個位置,慢指標每次移動乙個位置
2.當快指標和慢指標相遇時,將慢指標重新指向煉表頭
3.快指標和慢指標此時在同時移動,兩個指標都一次移動乙個位置,當兩個指標再次相遇時,指標所指的節點即入口節點。
之所以這樣能夠定位環的入口節點,原因解析如下:
假設煉表頭節點為head,環入口節點為entrance,並假設有head到entrance共有n個節點(包括head,
但不包括entrance),環的節點個數為m。我們知道,快指標和慢指標第一次相遇的節點肯定在環中,
假設從entrance到這個節點共k個節點(包括entrance和相遇的節點)。那麼此時slow指標共移動了
n+k 個節點,fast指標共移動了 2*(n+k) 個節點。則有 2*(n+k) = n + k + x*m,其中x
表示此時fast指標已經在環中繞的圈數。由此可以得到 n+k=x*m,即 n = (x-1)*m + m - k
。那麼此時再將慢指標重新指向head,並且slow指標和fast指標均以同樣的速度,每次移動乙個節點
位置往後移動,那麼當slow指標走到entrance時,fast指標同樣移動到了entrance節點。
**如下:
slistnode* findbeginning(slistnode* head)
slistnode* fast = head;
slistnode* slow = head;
while (1) }
slow = head;
while (fast != slow)
return fast;
}測試用例如下:
void test14()
執行結果如下:
本文出自 「零點時光」 部落格,請務必保留此出處
尋找帶環的單鏈表的換的入口位置處的節點
題目 如本文題目,給定乙個帶環的單鏈表,給出乙個演算法求煉錶環的入口位置處的節點。解析 這題的解決步驟如下 1.設定乙個快指標fast和乙個慢指標slow,它們同時從煉表頭開始往後遍歷,快指標每次移動兩個位置,慢指標每次移動乙個位置 2.當快指標和慢指標相遇時,將慢指標重新指向煉表頭 3.快指標和慢...
帶環單鏈表及單鏈表的相交
帶環單鏈表的概念 當單鏈表的尾指標指向了鍊錶上任一非尾結點時,即生成了乙個帶環單鏈表。問題一 判斷是否帶環 通過快慢指標實現判斷,注意快指標必須是兩步,慢指標必須是一步,否則可能跨過 問題二 求環的入口點 通過數學思想,方法是使用一指標指向開頭,一指標指向環中的相交點,每次各走一步,如此所得相交點即...
找出有環單鏈表的入口節點
這個題比較經典 使用兩個指標去解決。乙個快指標,乙個慢指標。快指標每次走兩步,慢指標每次走一步。如果兩個指標相遇,那麼這個鍊錶是有環的。但是關鍵問題是鍊錶環的入口節點在 呢?數學證明貼上來 設定整個鍊錶的節點個數為n,環的節點個數為l,從煉表頭節點到環的入口節點距離為m,下文記作m節點。假設慢指標走...