檢測鍊錶中的環

2021-08-09 04:46:32 字數 1069 閱讀 9358

問題描述:給定乙個鍊錶,檢測該鍊錶中是否存在閉環。要求時間和空間複雜度。

問題分析:如果存在環,那麼我們在遍歷鍊錶的時候最終會進入一條無限迴圈中。我們可以把這視為2個人在操作運動,速度快的最終一定會趕上並且遇上速度慢的,也就是速度快的會比速度慢的多跑n整圈。

假設a和b倆個物體運動,速度分別為va,vb,要使得運動相差閉環的整圈。需要滿足幾個條件:

a. 首先速度需要有快慢我們讓vb>=va

b. 速度慢的物體a要進入環區域才可能有機會。所以有a的移動距離sa>閉環之前的直線距離sl

c. 在這裡我們是通過遍歷的方式,所以vb是va的整數倍。這裡的移動速度本質上還是遍歷,時間複雜度方面,我們這裡讓vb=2va即可,則有b的運動距離sb = 2sa。b比a多移動的距離sba = sb - sa = sa。

d. 由以可知sa >= sl,另環的周長為sr,sa是sr的整數倍,這裡我們取a的移動距離sa為》= sl的sr的最小整數倍的a和b相遇。那麼有sba = sr,sa=sr,sb=2sr(sr >sl)。

e. 舉例,如果sl=2,sr=5,那麼sa = 5;如果sl = 10,sr=9,那麼sa=18的時候b趕上a。

f. 時間複雜度為sa。

**邏輯

function

hasloop

(list,out pmeet)

}return hasloop

}

. 擴充套件:求乙個閉環鍊錶中的入環點

a. 我們假設在b趕上a的時候a在環內移動距離是s,那麼運動起點到環起點距離是sa - s

b. 沿著當前運動方向到環起點的距離是sr - s = sa - s,與以上相同。

function

getloopnode

(list)

return p

}

擴充套件:檢測兩條鍊錶相交匯合

將該2鍊錶頭尾拼接成一條:當然不一定需要真正意義的拼接,只是採用一定方式使得可以 遍歷完全2個鍊錶就可以了。

然後就採用以上的檢測是否閉環和求入環點的方式進行處理。

鍊錶演算法 檢測環

給定乙個單鏈表,判斷其中是否有環,已經是乙個比較老同時也是比較經典的問題,在網上蒐集了一些資料,然後總結一下大概可以涉及到的問題,以及相應的解法。首先,關於單鏈表中的環,一般涉及到一下問題 1.給乙個單鏈表,判斷其中是否有環的存在 2.如果存在環,找出環的入口點 3.如果存在環,求出環上節點的個數 ...

鍊錶 檢測是否有環

typedef struct node node,lnode 單鏈表bool isloop lnode ln return true 檢測兩個鍊錶是否相交 一種方法 首尾相交,如果有環則相交 否則不相交。node gettailnode lnode ln if null ln return null...

鍊錶環的檢測及其擴充套件

如何檢測乙個單向鍊錶有沒有環?前兩天別人問了我這樣乙個問題,乙個很長很長很長得單向鍊錶,怎麼檢測他是否有環,我想啊想啊想啊,想了半天沒想出來,後來查了一下發現原來如此啊,好思路啊。解法一 申請兩個指標,第乙個指標以步長1第二個指標以步長2同時遍歷鍊錶,如果指標2遇到了鍊錶的尾節點 即next為nul...