上次看到的題目僅是判斷是否有環,如果要求出環的起點位置又該如何呢?
這裡看到關於快慢指標的證明,感覺有必要記下來下。
假設煉表頭到環頭距離k,環長度n,指標相遇位置距離環頭為x,慢指標直到相遇時移動距離為m
那麼有m=k+x+pn,2m-m=qn;
那麼有qn=k+x+pn,即k+x=(q-p)n;
可以發現從表頭到相遇位置的距離是環長的整數倍。
那麼,將slow或者fast任意乙個指標從相遇位置直接移動到表頭。
然後while(slow!=fast)slow++,fast++(這裡fast也只一次一步)
那麼最後slow=fast時,一定是環頭位置。
node * f(node*head)fast=head;
while(fast!=slow)
return
fast;
}
不過這種方法比較tricky,學c++的應該想到這樣的方法、
map看到這個容器自然就該知道接下來怎麼寫了
node * f(node*head)return
head;
}
快慢指標 雙指標
雙指標 二 左右指標的常用演算法 鏈結 利用快慢指標 最開始slow與fast指標都指向鍊錶第乙個節點,前者解決主要解決鍊錶中的問題,listnode detectcycle listnode head slow head while slow fast return slow 設相遇點距環的起點的...
快慢指標問題
快慢指標可以用來檢測鍊錶是否有環,問題是為什麼快指標一定會追上慢指標呢?從數學的角度,當快指標步長為2時,慢指標走完一圈,此時快指標走完2圈,必定在第乙個節點相遇 以此類推,當快指標步長為n時,慢指標走完一圈,此時快指標走完n圈,必定會在第乙個節點相遇,但是初次遇見未必是在第乙個節點 有意思的是從物...
快慢指標(一)
快慢指標的概念 該方法會在乙個鍊錶內使用速度不同的兩個指標,來解決一些鍊錶中的實際問題。該方法的主要應用場景 判斷乙個鍊錶中是否含有環 若乙個鍊錶中含有環,找到環路開始的位置 判斷乙個鍊錶是否是回文鍊錶 尋找一組數中的重複數 本篇文章先介紹前兩個應用。判斷乙個鍊錶中是否有環 判斷乙個鍊錶中是否有環,...