如何查找給定鏈表中循環的開始節點?我們到目前爲止,稱其爲週期來看查找鏈接列表中循環的開始節點?
,我已經明白了以下(使用快/慢指針):
- 假設列表中有大小
k
- 緩慢的非循環部分移動k步
- 快速移動2K步驟
- 快(2K - K)=
k
步驟的緩慢 ahead
慢是在循環的開始;也被稱爲Cycle point
- 快是
(LOOP_LENGTH - k)
此時 - 每次1步緩慢移動時,快速移動2步和增益上緩慢通過1步的步從
Cycle point
或慢指針behind
。 - 因此,將採取快速
(LOOP_LENGTH - k)
措施,以滿足慢,碰撞 - 這是一步我不明白: 在此碰撞點,兩個節點會從循環的前
k
步驟。 - 找到碰撞點後,將一個指針移動到列表頭部。
- 現在以1步/轉的速度移動兩個指針直到碰撞。他們都遇到的節點是循環的開始,因此
Cycle point
有人可以解釋我第9步,然後呢?
感謝
編輯:
有一兩件事我想指出的是,一旦循環裏面,快速的將永遠不會超過慢指針。他們會碰撞。這就是爲什麼:慢我在,我快速假設在I - 1。當他們移動時,slow => i + 1並且fast也會在i + 1上,因此碰撞。或者,我速度很慢,速度很快,在i-2。下一步,慢 - > i + 1;快:我。下一步,慢 - >我+ 2,快:我+ 2,因此再次碰撞。如此之快的速度永遠無法超越緩慢,只會在循環內碰撞一次!
你能解釋一下這種關係:m = k + loop_length - r = some_n * loop_length + r + loop_length - r =(some_n + 1)* loop_length'? – brainydexter 2012-07-22 14:19:32
我剛剛取代了這些值。 :)直到兩個指針相遇的步驟總數,它是什麼?我們說我們有'k'步驟直到循環點;當'k'慢時,在慢速之前fast是'r = k%loop_length';即** slow是在fast **之前的'loop_length - r' - 因爲如果我們將距離加到fast,然後從fast到它,我們就得到'loop_length'。這就是擁有*循環*的意思。而'r = k%loop_length'意思是對某個值some_n(包括0)來說'k = some_n * loop_length + r'。所以'm = k + loop_length - r'。 – 2012-07-23 00:09:17
(續)** slow是快於loop_length的前r,所以它需要'loop_length - r'的步驟讓fast趕上slow,所以他們會在某個地方見面。總步數將爲'm = k + loop_length - r'。 – 2012-07-23 00:14:05