1. 程式人生 > >演算法之(二)判斷一個單鏈表是否有環

演算法之(二)判斷一個單鏈表是否有環

思路:如果一個單鏈表中有環,用一個指標去遍歷,永遠不會結束,所以可以用兩個指標,一個指標一次走一步,另一個指標一次走兩步,如果存在環,則這兩個指標會在環內相遇,時間複雜度為O(n)。

拓展問題1:如果單鏈表有環,找出環的入口節點(環的連線點)。

這裡先證明一個定理:碰撞點到連線點的距離=頭指標到連線點的距離

假設單鏈表的總長度為L,頭結點到環入口的距離為a,環入口到快慢指標相遇的結點距離為x,環的長度為r,慢指標總共走了s步,則快指標走了2s步。另外,快指標要追上慢指標的話快指標至少要在環裡面轉了一圈多(假設轉了n圈加x的距離),得到以下關係: s = a + x 2s = a + nr + x =>a + x = nr 設定一個頭指標走了a+x,慢指標從相遇位置繞n圈,最後一定會在相遇點相遇 由上式可知:若在頭結點和相遇結點分別設一指標,同步(單步)前進,則最後一定相遇在環入口結點。