中《單鏈表的環的入口點乙個小證明》
如何判斷乙個單向鍊錶是否有環?如果有,如何找到其入口節點的指標?
演算法思想:用兩個指標p1,p2同時指向鍊錶的頭部,p1一次移動一步,p2一次移動兩步,如果最終p1和p2重合則說明鍊錶有環,如果p2走到空指標(鍊錶的結尾)則說明鍊錶無環; 如果最終p1和p2重合,使p2重新指向鍊錶的頭結點,然後p1和p2同時一次移動一步,當p1和p2再次重合時該節點指標就是環的入口節點指標
可能有人問為什麼會第二次會相遇呢
首先如果單鏈表有環的話,必在尾端出現
設單鏈表非環的部分為x個節點,環的部分為y個節點
那麼第一次當p1走入環的入口點即走了x步時,p2已經走了2x個節點,也就是在環的內部走了x個節點( nyp2所在的位置是 環的第(x-ny)個節點的位置,然後那麼距環的入口的距離是y-(x-ny), 而此時p1在環的入口處,那麼p2要追上p1這需要走y-(x-ny)步
而此時p1重新走,p2步伐也變為1 那麼當p1走入入口時 p2也走了x步了 所以p2總共走了 2(x+y-(x-ny))+x=2(n+1)y+x個節點 我們可以想啊,p2是不是走了x步後然後在環中轉了2(n+1)圈 所以p2此時是在環的入口點俄,同時p1也剛好走到環的入口點,所以說此時它們剛好在環的入口點相遇
也可以用hash,參考:
如何檢測乙個單鏈表有環並找出環入口點
解決方法 定義兩個指標fast和slow,其中,fast是快指標,slow是慢指標,二者的初始值都指向煉表頭,slow指標每次前進一步,fast指標每次前進兩步,兩個指標同時向前移動,快指標移動一次都需要和慢指標進行比較,直到相同位置,就可以證明鍊錶是帶環的單鏈表。public boolean is...
判斷乙個單鏈表是否有環及環入口
要求 不允許修改鍊錶結構 時間複雜度o n 空間複雜度o 1 判斷是否有環 如果鍊錶有環,那麼在遍歷時則會陷入死迴圈。使用快慢指標 快指標移動2步,慢指標移動1步 如果走到某一步,快慢指標相遇,則說明有環 環入口點 我們假設鍊錶頭部到環入口距離 len,環入口到快慢指標交匯點的距離為x,環的長度為r...
單鏈表的環入口,環大小,解環
1.單鏈表是否有環 使用快慢指標,都從head出發,慢指標一次一步,快指標一次兩步,如果兩個指標相遇,說明鍊錶有環,否則,快指標為null或其next為null,到達末尾節點 function hascircle head return fast null fast.next null 2.單鏈錶環...