這兒例子使用快慢指標的辦法實現。
(h) lengthx (e)
| | (m) (e->m: lengthy)
(m->e: lengthz)
length of circle = lengthy + lengthz
假定1. 開始點是h, 環的進入點是e, 快指標和慢指標首次相遇的點是m.
2. 慢指標和快指標首次相遇在m點的時候, 是慢指標首次到達m點, 而此時快指標是第n(n>=2)次到達m點。
3. 此後如何快指標慢指標還是按照原來的邏輯走, 那麼當下一次慢指標到達m點的時候, 快指標和慢指標又相遇與m點, 也就是說以後每次他們倆都相遇與m點, 而此時慢指標正好又走了一圈, 而快指標正好又走了兩圈。
-- 計算入口點e和環長度--
當慢指標首次到達m點的時候, 慢指標走過的路程是(h->e) 和(e->m)其長度為lengthx+lengthy
而此時快指標走過的長度為2(lengthx+lengthy), 因為慢指標都一步, 快指標走兩步.
快指標走過的長度 = lengthx + lengthy + (lengthy + lengthz) * n = 2 * (lengthx+lengthy) // n >= 1
=> (lengthy + lengthz) * n = (lengthx+lengthy)
當把快慢指標分別從m點按照步進1的速度往回退的時候, 當慢指標回退到h點時, 快指標正好回退到m點, 此時把快慢指標分別按照步進1的速度前進, 當他們相遇的時候就是環的第乙個入口點e。
code start
code end
檢測鍊錶是否存在環的演算法證明
今天看到c專家程式設計的最後,有一處關於檢測鍊錶是否存在環的演算法介紹,這個問題和演算法之前在很多地方有看見,大致是有三個問題 1.給你乙個單向鍊錶判斷是否有環 2.求出環的長度 3.給出環的開始節點。演算法是這樣 讓兩個指標指向表頭,乙個每次移動一步,叫做慢指標,乙個每次移動兩步,叫做快指標,一直...
鍊錶是否存在環
鍊錶環的問題有兩種,一種是判斷是否存在環,另一種是在有的基礎上返回入環的第乙個節點。簡單思路 1 遍歷鍊錶,如果遇到空,那麼肯定無環。2 在遍歷的過程中,每個節點都加入到雜湊表中,加入前判斷是否存在,如果存在的話那麼就有環,而且第乙個判斷存在的節點就是入環的第乙個節點。總結 這個比較簡單,既可以做到...
鍊錶 檢測是否有環
typedef struct node node,lnode 單鏈表bool isloop lnode ln return true 檢測兩個鍊錶是否相交 一種方法 首尾相交,如果有環則相交 否則不相交。node gettailnode lnode ln if null ln return null...