判斷乙個單鏈表中是否有環

2021-09-30 11:07:56 字數 1054 閱讀 8150

一、題目

判斷乙個單鏈表中是否存在環。

二、解法

設定兩個工作指標slow和fast,初始值都指向群頭節點,slow每次前進一步,fast每次前進兩步,如果鍊錶中存在環,則fast必定先進入環,而slow後進入環,兩個指標必定相遇。(當然,fast遍歷到null,則為無環鏈表)這樣就可以判斷兩個鍊錶是否相交了。

**實現:

bool isloop(linklist *list)

return !(fast == null||fast->next==null);}

三、拓展問題 

尋找鍊錶環的入口節點。

解法:當fast和slow相遇時,slow肯定沒有走遍完鍊錶,而fast已經在環內迴圈了n圈(n>=1)。假設slow走了s步,則fast走了2s步(fast步數還等於s加上在環上多走的n圈),設環長為r,則:

2s=s+nr;

s=nr;

設整個鍊錶長l,環入口與相遇點距離為x,起點到環入口的距離為a。

則有:a+x=s=nr;

a+x=(n-1)r+r=(n-1)r+l-a;

a=(n-1)r+(l-a-x);

(l-a-x)為相遇點到環入口點的距離,由此可知,從煉表頭到環入口點等於(n-1)迴圈內環+相遇點到環入口點的距離。

於是我們從煉表頭、與相遇點分別設乙個指標,每次各走一步,兩個指標必定相遇,且相遇點為環入口點,也即為兩個鍊錶的第乙個相同節點。

實現**:

linklist* findloopport(linklist *head)

if (fast == null || fast->next == null)

return null;

slow = head;

while (slow != fast)

return slow;

}

判斷乙個單鏈表是否有環

一 判斷鍊錶是否存在環 設定兩個指標 fast,slow 初始值都指向頭,slow每次前進一步,fast每次前進二步,如果鍊錶存在環,則fast必定先進入 環,而slow後進入環,兩個指標必定相遇。當然,fast先行頭到尾部為null,則為無環鏈表 程式如下 bool i itsloop listn...

判斷乙個單鏈表是否有環及環

判斷乙個單鏈表是否有環及環的鏈結點 蒙恩的罪人 給定乙個單鏈表,只給出頭指標h 1 如何判斷是否存在環?2 如何知道環的長度?3 如何找出環的連線點在 4 帶環鍊錶的長度是多少?解法 1 對於問題1,使用追趕的方法,設定兩個指標slow fast,從頭指標開始,每次分別前進1步 2步。如存在環,則兩...

如何判斷乙個單鏈表是否有環

題目要求 給定乙個單鏈表的頭指標head,要求寫乙個函式判斷這個單鏈表是否是乙個有環單鏈表。單鏈表中的節點定義如下 struct listnode 方法1 首先定義乙個mapmap,然後從單鏈表的頭指標開始往後遍歷,每次遇到乙個指標p,就判斷map pcur 是否為0,若為0,則將map pcur ...