一、題目
判斷乙個單鏈表中是否存在環。
二、解法
設定兩個工作指標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 ...