[英]Looking to understand the algorithm to find the start of a loop in a singly linked list
這里是一個非常優雅的解決了這個問題在這里 ,但我不明白的最重要的部分-為什么,移動S回列表開始后,分別為S和F從循環開始相同的距離? 他做了一些數學運算來“證明”它,但是對我來說這沒有意義。 任何對更好地理解這一點的幫助將不勝感激。 謝謝!
為了解決這個問題,我們假設存在一個n
節點循環,該循環從起點開始數m
節點開始,並且我們正在使用慢速指針S(每步一個節點)和快速指針F(每步兩個節點)進行遍歷。 為了簡潔起見,我們假設m < n
,但這無關緊要(只需執行一些模塊化算術)。
關鍵是要認識到S和F將在節點n - m
處重疊。 誠然,本文中完成的數學運算有些困難,並且似乎不能推廣為奇數n
。 不知道這會容易得多,但我會嘗試。
假設S從循環的開始處開始,F從循環的開始處開始k
節點,我們開始遍歷循環。 在時間步長x
,S將是循環開始之后的x
節點,F將是循環開始之后的2x + k
節點。 當然,直到F越過循環的開始,F才會超過S,在這一點上,我們可以等效地將其描述為超過開始的(2x + k) - n = 2x - (n - k)
節點。
我們現在問,“ x
和S在哪一步重疊?” 就是說,當S的位置等於F的位置時,因此x = 2x - (n - k)
或(使用一些簡單的代數), x = n - k
。 因此,兩個指針都將在循環開始之后為n - k
節點。
回到原來的問題(兩個指針都從列表的開頭開始),到S到達起點(以m
步為單位)時,F將經過2m
步,因此將在循環開始之后m
節點( 2m - m = m
)。 用上面的m
替換k
,我們看到當指針F(和S)是循環開始之后的n - m
節點時,節點將重疊。 因此,如果我們將S返回到起點,則F和S都將花費m
步返回到循環的起點。
讓我知道是否有幫助。
讓我知道你是否願意得到這個。 樂意為您提供幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.