鍊錶中是否有環141 142

2021-10-05 09:20:29 字數 738 閱讀 2961

判斷鍊錶中是否有環

設定兩個指標,乙個快乙個慢

每次慢的走一步,快的走兩步,如果相遇就說明有環

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,...