判斷單連結串列中是否存在環,並輸出環入口節點。

Ss--發表於2020-11-18

學習了這位大神的方法,這裡只是個人的理解。詳情請點選
基本思路:
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){
if (head == null ) {
return null;
}
MySingleLinkedList.Node slow = head;
MySingleLinkedList.Node fast = head;
while(fast != null && fast.next != null ){
slow = slow.next;
fast = fast.next.next;
if (slow == fast){
MySingleLinkedList.Node tmp = head;
MySingleLinkedList.Node tmp1 = slow;
while (tmp != tmp1){
tmp = tmp.next;
tmp1 = tmp1.next;
}
return tmp;
}

        }
            return null;
    }`

這裡是力扣測試結果:
在這裡插入圖片描述

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

相關文章