判斷鍊錶中是否有環
設定兩個指標,乙個快乙個慢
每次慢的走一步,快的走兩步,如果相遇就說明有環
public
boolean
hascycle
(listnode head)
else
return
false;}
return
false
;}
和上面的區別是如果有環,要返回環的入口結點,如果沒環就返回空
先假設 入口結點是 entry,快慢指標相遇的結點是 meet
那麼head到entry的距離是a,entry到meet的距離是b,環的長度是len
在快慢指標相遇時兩個指標各走的路程:慢:a + b;快:a + n*len + b
因為快指標速度是慢的2倍,所以得到 2*(a+b) = a + b + n*len, 得到 a+b = n*len,得 a = n*len - b
即head 到 entry的長度 等於 環的n倍的長度 減去entry到 meet的長度
相當於說乙個指標從head走到entry時,另乙個指標從meet出發,走了n*len - b後也同時到達entry
public listnode detectcycle
(listnode head)
return entry;}}
return null;
}
判斷鍊錶中是否有環
單向鍊錶中有環的話,如果我們對此鍊錶進行遍歷,則將無窮盡。因此有必要判斷乙個單向鍊錶是否有環。假如乙個單向鍊錶中存在環,如下圖 乙個小矩形代表鍊錶中的乙個節點 虛線箭頭代表中間有無數節點。先說演算法,然後再來證明演算法的正確性。鍊錶的頭指標為h if null h null h next 頭指標為空...
如何判斷鍊錶是否有環 鍊錶是否有環的判斷
對於鍊錶是否存在環,有三個問題需要考慮 1.是否有環 2.入環節點 3.環的長度 第一種方法快慢指標法,也稱之為龜兔演算法,設定兩個指標,慢指標和快指標。最開始均指向鍊錶的頭節點,之後,快指標每次後移兩個節點,慢指標每次後移乙個節點。1.如果快指標指向空,則鍊錶無環 2.若快指標和慢指標再次指向乙個...
鍊錶是否相交,鍊錶是否有環問題
1 乙個單鏈表,判斷是否有環,環的入口節點 分析 兩個指標,慢指標一次走一步,快指標一次走兩步,如果有環肯定會相交 listnode pnode bool i istloop listnode head return false 找出環的入口 環入口到相遇點為x,從開始到環入口點長度為a,環長為r,...