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

2021-06-02 19:06:53 字數 901 閱讀 7884

如何檢測乙個單向鍊錶有沒有環?

前兩天別人問了我這樣乙個問題,乙個很長很長很長得單向鍊錶,怎麼檢測他是否有環,我想啊想啊想啊,想了半天沒想出來,後來查了一下發現原來如此啊,好思路啊。

解法一:

申請兩個指標,第乙個指標以步長1第二個指標以步長2同時遍歷鍊錶,如果指標2遇到了鍊錶的尾節點(即next為null的節點),則鍊錶無環,如果兩個指標指向同一節點,則說明鍊錶有環。

衍生問題一、 鍊錶有環的情況下,環中的節點數是多少?

這個問題相對簡單,讓第二個指標指向相遇的節點,第乙個指標從相遇的節點開始以步長1開始遍歷鍊錶,當兩個指標再次相遇則第乙個指標經過的路程即環中的節點數,記做cnc(cyclical node count)。

衍生問題二、 找出環的開始節點。

第乙個指標指向頭結點,第二個指標指向相遇的節點,同時都以步長1開始遍歷鍊錶,當他們再次相遇時,就是環開始節點。

證明如下:設環之前有n個節點,環中有m個節點,相遇點在在環中的位置為m1,指標二在相遇前繞環迴圈了x圈,則有 (n+m1)*2=m*x+m1 ,代換可得 n=m(x-1)+(m-m1) .

即在第二次遍歷的時候指標二繞環迴圈了x-1圈時在環開始點他們剛好相遇,真是巧合的不得了。

解法二:

此題還有乙個稍差一點的解法,將鍊錶逆序,如果最後尾節點是頭節點(有環的時候又會繞回來),則說明鍊錶有環。

解法三:

這是我自己想出來的方法,不過明顯不適用,或者說根本不對。

給鍊錶的 每個節點新增乙個檢測位,初始化為0,在檢測的時候遍歷鍊錶,遍歷過的部分將檢測位置1,遍歷過程中如果某個節點的檢測位為1,則說明節點在此處形成了乙個環。

解法四:

同方法三一樣是我最初乙個想法,設想鍊錶的每個節點有個id號,而且是按順序排列的,後面每乙個節點id號都更大,如此如此,如此這還是單向鍊錶嘛,哈哈。

鍊錶演算法 檢測環

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

檢測鍊錶中的環

問題描述 給定乙個鍊錶,檢測該鍊錶中是否存在閉環。要求時間和空間複雜度。問題分析 如果存在環,那麼我們在遍歷鍊錶的時候最終會進入一條無限迴圈中。我們可以把這視為2個人在操作運動,速度快的最終一定會趕上並且遇上速度慢的,也就是速度快的會比速度慢的多跑n整圈。假設a和b倆個物體運動,速度分別為va,vb...

鍊錶 檢測是否有環

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