快慢指標的概念
該方法會在乙個鍊錶內使用速度不同的兩個指標,來解決一些鍊錶中的實際問題。
該方法的主要應用場景:
判斷乙個鍊錶中是否含有環
若乙個鍊錶中含有環,找到環路開始的位置
判斷乙個鍊錶是否是回文鍊錶
尋找一組數中的重複數
本篇文章先介紹前兩個應用。
判斷乙個鍊錶中是否有環
判斷乙個鍊錶中是否有環,可以設定兩個指標fast、slow,**fast指標每次移動兩個格,slow指標每次移動乙個格。**若該鍊錶不含有環,則fast指標最終會指向null;若含有環,則快指標會與慢指標在環中相遇。
如下圖所示:
開始時,fast、slow指標指向1,後fast指標依次移動2格,slow指標移動1格,即fast指標依次指向3 5 3 ,slow指向2 3 4 ,後一起指向5相遇,判斷出煉表中含有環。
鍊錶結構
class
listcode
};
**實現
bool
hascycle
(listcode head)
return
false
;}
找到有環鏈表環路開始的位置使用快慢陣列還可以找出有環鏈表環路開始的位置。環路開始的位置,就是開始成環元素所在的位置。例如在上述鍊錶中,環路開始的位置就是3;
假設fast指標和slow指標在圓孔處相遇,我們想知道環路開始的位置,即a的長度。
假設fast指標在環路中轉了n圈,則fast指標走過的路程為a+b+n(b+c),slow指標走過的路程為a+b.由於fast指標的速度是slow指標的兩倍,故a+b+n(b+c)=2(a+b).化簡一下,即a=(n-1)b+nc.
考慮上面方程的含義,即c總比b多一圈。於是我們在設兩個指標a1,a2,a1指向鍊錶起始位置,a2指向fast、slow指標相遇的位置,這次保持速度一致,當a1走到環路開始位置時,a2也正好在此位置(注意a2走的路程不一定c,可能已經在環路中轉了幾圈),所以a1、a2相遇的位置就是環路開始的起點。
**實現
listcode detectcycle (listcode head)
listcode a,b;
a1=head;
a2=fast;
while
(a1!=a2)
return a1;
}
快慢指標 雙指標
雙指標 二 左右指標的常用演算法 鏈結 利用快慢指標 最開始slow與fast指標都指向鍊錶第乙個節點,前者解決主要解決鍊錶中的問題,listnode detectcycle listnode head slow head while slow fast return slow 設相遇點距環的起點的...
快慢指標問題
快慢指標可以用來檢測鍊錶是否有環,問題是為什麼快指標一定會追上慢指標呢?從數學的角度,當快指標步長為2時,慢指標走完一圈,此時快指標走完2圈,必定在第乙個節點相遇 以此類推,當快指標步長為n時,慢指標走完一圈,此時快指標走完n圈,必定會在第乙個節點相遇,但是初次遇見未必是在第乙個節點 有意思的是從物...
快慢指標二
上次看到的題目僅是判斷是否有環,如果要求出環的起點位置又該如何呢?這裡看到關於快慢指標的證明,感覺有必要記下來下。假設煉表頭到環頭距離k,環長度n,指標相遇位置距離環頭為x,慢指標直到相遇時移動距離為m 那麼有m k x pn,2m m qn 那麼有qn k x pn,即k x q p n 可以發現...