判斷單向鍊錶是否有環,環起點,環長,鍊錶長

2022-07-31 12:12:12 字數 1463 閱讀 5381

一、判斷單向鍊錶是否有環

方法1:設定乙個hashset,順序讀取鍊錶中的節點,判斷hashset中是否有該節點的唯一標識(id)。如果在hashset中,說明有環;如果不在hashset中,將節點的id存入hashset。

這種方法時間複雜度已經最優,但是因為額外申請了hashset,所以空間複雜度不算最優。

方法2:設定2個指標,指向頭節點。第1個指標每次指向下乙個節點;第2個指標指向下乙個節點的下乙個節點(可以大致理解為,第1個指標每次加1,第2個指標每次加2)。如果第2個指標指向null,說明到達鍊錶結尾,鍊錶中沒有環;如果鍊錶中有環,一定會在環上的某個節點處,兩個指標同時指向同乙個節點。這就是追擊相遇的問題。

文章的作者提到了為什麼兩個指標一定會在環上相遇,做了乙個模擬,運動員沿跑道跑步,乙個快乙個慢,二人無限迴圈,兩人一定在某個位置再次相遇,就是所謂的扣圈。但是個人覺得這只是乙個模擬,不能真正的證明有環鏈表同樣適用。畢竟人跑步是乙個連續的問題,而鍊錶的追擊問題是乙個離散的問題。

我的理解,假設在慢指標進入環的時候,快指標到慢指標的距離為n;那麼下一次移動的時候,快指標到慢指標的距離將縮小為(n-1);再下次,為(n-2);即每次移動,距離縮小1,如此往復,兩個指標的距離最終將變成2,進而變成1,最終變成0。而且從慢指標進入環開始計算,到二者相遇,一定經過了n次的移動。

二、求環的長度

因為有上面的結論(從慢指標進入環開始計算,到二者相遇,一定經過了n次的移動)。相似的,可以得到如下結論,假設環長為r,從二者在環上第一次相遇,到二者在環上第二次相遇,一定經過了r次移動。

因此,只要記錄二者從第一次相遇到第二次相遇一共移動了多少步,就知道環長了。

三、求環的起點的位置

假設起點到環起點的長度為lena;開始到第一次相遇,移動了t步;環的長度為r;環的起點到二者第一次相遇位置的距離為x,二者相遇的時候快指標已經在環上轉了n圈。

則有如下等式成立: 慢指標移動的距離=lena + x; 即 t = lena + x;

快指標移動的距離=lena + n * r + x; 即 2t = lena + n * r + x;

所以 2*(lena+x) = lena + n*r + x;

即 lena = n * r - x;

上面的等式可以這樣理解,如果慢指標從鍊錶起點開始移動,快指標從環起點開始移動,當慢指標從起點走到環起點的時候,快指標一直在環上移動,而且還差x步就移動了n圈。進而可以得到結論,如果慢指標從鍊錶起點開始移動,快指標從二者第一次相遇點開始移動,當慢指標到達環起點的時候,快指標也正好達到環起點,即二者指向相同的節點。

四、求煉表長

有了二中的環長r和三中的lena,二者相加就是鍊錶長。

五、無聊的補充

後來坐車的時候想到這樣乙個東西,可能沒什麼用途,先記錄下來。當慢指標到達環起點時,假設這時快指標在posb處,posb距離環起點的距離也是x。

單向鍊錶判斷是否有環

如何最有效的檢查單向鍊錶中是否包含了環。請避免使用額外的記憶體。先給出答案吧 定義兩個指標。指標a從鍊錶開始處每次向後移動一個節點。指標b從鍊錶開始處每次向後移動兩個節點。問題的關鍵是乙個單項鍊表中只可能有乙個環,並且指標一旦進入環中就無法離開。因此我們可以預期經過一段時間後,a剛好指向環的第乙個節...

判斷單向鍊錶是否有環

若單向鍊錶存在環那麼鍊錶的形態為 有環的鍊錶簡單的遍歷走不到尾 那麼我們怎麼判斷有環呢?環就像是操場的的跑到 那麼運動天賦一向不太好的 我很容易就能想到跑步時容易讓人扣圈 同理 我們可以定義兩個指標讓他們同時指向鍊錶的頭 乙個指標一次走兩步 乙個指標一次走一步 那麼如果鍊錶有環那麼他們一定會在環內的...

判斷單向鍊錶是否有環

找出環的入口點 求環的長度 求環上距離任意一點最遠的點 判斷兩個無環鏈表是否相交 判斷相交的位置 給乙個單鏈表,判斷其中是否有環的存在 如果存在環,找出環的入口點 如果存在環,求出環上節點的個數 如果存在環,求出鍊錶的長度 如果存在環,求出環上距離任意乙個節點最遠的點 對面節點 如何判斷兩個無環鏈表...