題目:
如本文題目,給定乙個帶環的單鏈表,給出乙個演算法求煉錶環的入口位置處的節點。
解析:
這題的解決步驟如下:
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節點。
**如下:
linkedlistnode findbeginning(linkedlistnode head)
}// 給定的鍊錶沒有換
if (n2.next == null)
//第二次遍歷鍊錶,定位環的入口
n1 = head;
while (n1 != n2)
return n2;
}
求帶環的單鏈表入口位置處的節點
題目 如本文題目,給定乙個帶環的單鏈表,給出乙個演算法求煉錶環的入口位置處的節點。解析 這題的解決步驟如下 1.設定乙個快指標fast和乙個慢指標slow,它們同時從煉表頭開始往後遍歷,快指標每次移動兩個位置,慢指標每次移動乙個位置 2.當快指標和慢指標相遇時,將慢指標重新指向煉表頭 3.快指標和慢...
尋找單鏈表中的環的入口結點
一,問題描述 給定乙個單鏈表,單鏈表中有環,請找出這個環的入口結點。比如,如下單鏈表 入口結點是,結點4.二,實現思路 如果僅僅是尋找入口結點,可以更改結點元素的值的話,只需要掃瞄一遍就可以找到入口結點了。比如,假設所有的結點值都是正數,從頭開始,那麼在掃瞄過程中,將掃瞄的結點的值與 0 比較,如果...
帶環單鏈表及單鏈表的相交
帶環單鏈表的概念 當單鏈表的尾指標指向了鍊錶上任一非尾結點時,即生成了乙個帶環單鏈表。問題一 判斷是否帶環 通過快慢指標實現判斷,注意快指標必須是兩步,慢指標必須是一步,否則可能跨過 問題二 求環的入口點 通過數學思想,方法是使用一指標指向開頭,一指標指向環中的相交點,每次各走一步,如此所得相交點即...