鍊錶有環問題及入環節點數學原理解析

2021-09-25 14:00:06 字數 1380 閱讀 8391

先上**:下面這段**僅判斷乙個鍊錶是否有環,有環的話,單鏈表的形狀只可能是」o」型或者是「p」型

class node

}public class circle

node fast = head.next.next;//為什麼起始值得先跑一步或者兩步了,因為迴圈的條件是快慢指標不等

node slow = head.next;

while(fast != slow)else

}return true;}}

原理解析:快指標一次移動兩步,慢指標一次移動一步,快指標一定能和慢指標相遇嗎?

毋庸置疑,當快慢指標都進入乙個環內的時候,快指標一定可以超越慢指標,但是問題是:因為它一次移動兩步,有可能就直接跑到慢指標前面乙個單位去。

那麼我們就研究當快指標跑到慢指標前面乙個單位的時候,有沒有可能接下來與慢指標相遇。

當遇到上面那種情況時,我們把慢指標位置標為0,快指標的位置標為1,環內共n個節點。

那麼t個時間單位後相遇,則公式如下:

換一種思路:

假如我們不取模,直接相加,只要

即只要滿足:

怎麼返回這個入環點的節點呢?

當fast指標和slow指標在環中相遇後,把fast指標移動到頭指標,然後fast改為一次移動一步,這樣,兩個指標一定會在入環節點處相遇。

原理解析:

當處於第一階段:快指標一次走兩步,慢指標一次走一步的時候,

假設分支部分是n個節點,環內是m個節點,假設經歷t個時間單位後相遇,則可以表示為

也就是那麼相遇時:慢指標走過的節點數為

那麼此時快指標回到頭指標,即乙個時間單位僅移動乙個節點,那麼假設t時間後,兩指標相遇。

則公式表示為

也就是我們把p取為k的話,這個等式就恒等了,說明什麼。

說明兩指標一直相遇,但是我們結合題目知道,如果快指標(當然現在已經不快了)在分支鍊錶上它們是不可能相遇的,

所以它的意思就是,當快指標第一次進入環,快慢指標就相遇了(再次強調:此時快指標已經變成乙個時間單位乙個節點了)

因為它們速度相同,那麼當然就一直相遇了。

返回入環節點的**如下,注意和上面的**有區別的:

public class circle 

node fast = head.next.next;//為什麼起始值得先跑一步或者兩步了,因為迴圈的條件是快慢指標不等

node slow = head.next;

while(fast != slow)else

}fast = head;

while(fast != slow)

return fast;}}

如何判斷鍊錶有環以及求入環節點

如何判斷單鏈表有環,並找出環的入口?時間o n 空間o 1 這個面試題還是蠻有趣的,當時只想出了第一問,第二問實在巧妙。如圖這個單鏈表,藍色的部分是環。對於如何判斷鍊錶有環,可以從起點發出兩個指標,乙個一次一步,另乙個一次兩步,如果兩個指標相遇,那麼這個單鏈表就有環。設綠色的地方是指標相遇點。對於第...

判斷鍊錶是否有環,找到入環節點 python實現

用快慢指標的方法。時間複雜度o n 空間複雜度o 1 設定p1為慢指標,p2為快指標,兩者初始時都指向鍊錶的頭結點 慢指標p1每次前進1步,快指標p2每次前進2步。如果鍊錶存在環,則快指標p2肯定先進入環,慢指標p1後進入環,兩個指標必定會相遇。如果不存在環,則快指標會先行到達鍊錶的尾部變為none...

鍊錶判斷是否有環,如有,找入環節點

一條鍊錶如何判斷是否有環?若是有環那怎麼找到鍊錶環的入口?思路 用快慢兩個指標分別從煉表頭開始,慢指標一次走乙個節點,快指標一次走兩個節點next next,這樣如果有環那快指標務必會跑到慢指標後面,隨即兩者之間的距離一次會縮小一步,最終相遇。若是未相遇且快指標的 next 為 null,則說明鍊錶...