判斷單鏈表中是否存在環,並輸出環入口節點。

2021-10-10 15:06:14 字數 1178 閱讀 1996

學習了這位大神的方法,這裡只是個人的理解。詳情

基本思路:

1. 首先判斷是否有環:使用了追逐的方法 定義乙個快引用 fast 和慢引用 slow 。快引用走兩 步,慢引用走一步。如果快引用和慢引用相遇了,則說明有環,反則無環。

2. 求環的入口節點:

在這裡學習了上面鏈結的方法:

當快慢引用都走到環 裡時,快引用就一定會在環裡迴圈跑,因為快是慢的兩倍速度,則兩者一定會相遇。 這個位置記為x

n:快引用轉的圈數,r:環的周長x:入口到相遇的距離

則快走了2s = a+ nr +x

慢走了s = a+x;

得出關係 :a+x = nr

a = nr - x

所以當n轉一圈時:a = r-x

如圖:

所以:繼續定義兩個引用,tmp 和 tmp1 ,tmp從head開始走。tmp1從x位置向後走。

因為a 的距離等於r-x的距離,所以當tmp = tmp1 時,這個節點就是環入口節點。

這裡是**實現:`

public static mysinglelinkedlist.node ringnode(mysinglelinkedlist.node head)

mysinglelinkedlist.node slow = head;

mysinglelinkedlist.node fast = head;

while(fast != null && fast.next != null )

return tmp;

}

}

return null;

}`

這裡是力扣測試結果:

如果這裡有錯誤的地方歡迎指正。

單鏈表中判斷是否存在環

有乙個單鏈表,其中可能有乙個環,也就是某個節點的next指向的是鍊錶中在它之前的節點,這樣在鍊錶的尾部形成一環。1 如何判斷乙個鍊錶是不是這類鍊錶?2 如果鍊錶為存在環,如果找到環的入口點?擴充套件 判斷兩個單鏈表是否相交,如果相交,給出相交的第乙個點。有乙個單鏈表,其中可能有乙個環,也就是某個節點...

判斷單鏈表中是否存在環

1 使用快慢指標 慢指標每次移動乙個結點,快指標每次移動兩個結點,快指標移動的快,必將先進入環,待慢指標移動進環內,就有點像追及問題了,快指標移動的快,當 p1 p2 時,就說明快慢指標相遇了,即鍊錶有環。懶得畫圖,就描述一下算了。bool hascycle listnode head return...

判斷單鏈表是否存在環

有乙個單鏈表,其中可能有乙個環,也就是某個節點的next指向的是鍊錶中在它之前的節點,這樣在鍊錶的尾部形成一環。問題 1 如何判斷乙個鍊錶是不是這類鍊錶?2 如果鍊錶為存在環,如果找到環的入口點?解答 一 判斷鍊錶是否存在環,辦法為 設定兩個指標 fast,slow 初始值都指向頭,slow每次前進...