學習了這位大神的方法,這裡只是個人的理解。詳情
基本思路:
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每次前進...