關於鍊錶是否有環,其實是一系列問題,主要包括以下幾個:
使用快慢指標fast和slow,fast每次走兩步,slow每次走一步,如果有環,肯定會相遇,如果沒有,則指標fast遇到null退出。追及相遇問題。
在環上相遇後,記錄第一次相遇點為pos,之後指標slow繼續每次走1步,fast每次走2步。在下次相遇的時候fast比slow正好又多走了一圈,也就是多走的距離等於環長。
設從第一次相遇到第二次相遇,設slow走了len步,則fast走了2*len步,相遇時多走了一圈:
環長=2*len-len
第一次碰撞點pos到連線點join的距離=頭指標到連線點join的距離,因此,分別從第一次碰撞點pos、頭指標head開始走,相遇的那個點就是連線點。在環上相遇後,記錄第一次相遇點為pos,連線點為join,假設頭結點到連線點的長度為lena,連線點到第一次相遇點的長度為x,環長為r。
第一次相遇時,slow走的長度 s =lena+x;
第一次相遇時,fast走的長度 2s =lena+ n*r+x;
所以可以知道,lena+x =n*r;lena = n*r -x;
上述2中求出了環的長度;3中求出了連線點的位置,就可以求出頭結點到連線點的長度。兩者相加就是鍊錶的長度。
不管快指標走多少步,只要有環就會與慢指標相遇,因為慢指標每次都走一步。但是如果快指標每次走三步以上,就會導致上述公式不成立。比如說快指標每次走三步,則公式變為:
第一次相遇時,slow走的長度 s =lena+x;
第一次相遇時,fast走的長度 3*s =lena+ n*r+x;
所以可以知道,2*lena+ 2*x =n*r;lena = n*r/2 -x;
舉例:頭結點之後就是環的入口,環除了入口還有乙個節點,fast每次走三步,slow每次走一步,第一次會在環的入口相遇,分別從第一次碰撞點pos、頭指標head開始走,無法相遇。
使用快慢指標判斷鍊錶是否有環
今天做到leetcode 141 linked list cycle,判斷鍊錶是否存在環,因為看到題目中的val都是整數,所以我是將每個node用1.1作為值去mark了,如果head.next的val是1.1,就說明我指向的下個結點已經走過了,這就是乙個環,如果走到最後head走到none了還沒返...
雙指標(快慢指標)判斷鍊錶是否有環
單鏈表的特點是每個節點知道下乙個節點 如果用乙個指標來判斷是否有環,當沒有環時,指標一直會指到鍊錶的為即指到null,但是當有環時,指標將陷入死迴圈,因為環形鍊錶中沒有null指標作為尾部節點 while head null head head.next return false 找到一種經典解法 ...
判斷乙個鍊錶是否有環(快慢指標)
1.問題描述 給出乙個鍊錶判斷該鍊錶是否有環 2.思路分析 我們可以使用一種比較經典的方式來進行處理,就是使用兩個指標來進行移動,乙個為快指標,乙個為慢指標,快指標一次移動兩步,慢指標一次移動一步,假如鍊錶有環的話那麼這兩個指標一定會在某乙個地方會相遇的,為什麼呢?有沒有可能不會相遇呢?答案是不可能...