簡體   English   中英

希望了解在單鏈表中查找循環起點的算法

[英]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步返回到循環的起點。

讓我知道是否有幫助。

  1. 取2個指針(f和s)。
  2. 從“鏈接”列表頭開始兩個指針。 使f(更快)以s(慢)的速度兩倍移動,即f跳兩次,s跳一次。
  3. 檢查他們是否見面。
  4. 如果它們相遇,則使s指向鏈接列表的開頭,並且不要更改f的值(因為f現在指向其會議節點)
  5. 現在使兩個指針速度相等,並使它們僅移動一個節點。
  6. 他們會面的地方將是循環的起點。 (要獲得此效果,只需繪制一個圖表或了解以上內容即可。

讓我知道你是否願意得到這個。 樂意為您提供幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM