判斷單鏈表是否存在環

2021-10-02 03:08:56 字數 850 閱讀 6631

判斷單鏈表存在環與否,可利用快慢指標,設慢指標一次走一步,快指標一次走兩步。讓兩指標開始的時候都指向表頭,迴圈執行,直達兩指標相遇,即快指標追上慢指標,或者快指標走到鍊錶尾部。前一種情況說明鍊錶存在環,後一種情況無環。

bool isloop(lnode *head)

if(p->next == null)

return false;

}若存在環,找到環的入口點

鍊錶長:l

起始點到環入口點的長度:a

環的長度:c

則 l=a+c

在快指標進入環到慢指標進入環之前的時間,若環的長度較短,快指標可能會在環內走多圈,然後慢指標才進入環內

假設慢指標和快指標在環內相遇時,慢指標在環內走了b步

慢指標走的總步數:b+a

快指標走的步數:nc+b+a (n>=1)

故有 2(b+a)= nc+b+a

即 b+a=nc

a = nc-b = (n-1)c+c-b;(c-b即相遇點距離環入口的距離)

上式表明環入口到起點的距離相遇點到環入口的距離相差整數倍的c

然後慢指標回到起點,快指標從相遇點開始,兩者步長都為1,當兩者相遇時,即環的入口。

lnode* findentrance(lnode *head)

if(p->next == null)

q=head;

while(q != p)

return p;

}

判斷單鏈表是否存在環

有乙個單鏈表,其中可能有乙個環,也就是某個節點的next指向的是鍊錶中在它之前的節點,這樣在鍊錶的尾部形成一環。問題 1 如何判斷乙個鍊錶是不是這類鍊錶?2 如果鍊錶為存在環,如果找到環的入口點?解答 一 判斷鍊錶是否存在環,辦法為 設定兩個指標 fast,slow 初始值都指向頭,slow每次前進...

判斷單鏈表是否存在環

判斷單鏈表是否存在環,判斷兩個鍊錶是否相交問題詳解 有乙個單鏈表,其中可能有乙個環,也就是某個節點的next指向的是鍊錶中在它之前的節點,這樣在鍊錶的尾部形成一環。問題 1 如何判斷乙個鍊錶是不是這類鍊錶?2 如果鍊錶為存在環,如何找到環的入口點?解答 一 判斷鍊錶是否存在環,辦法為 設定兩個指標 ...

判斷單鏈表是否存在環

問題 1 如何判斷乙個鍊錶是不是這類鍊錶?2 如果鍊錶為存在環,如果找到環的入口點?解答 一 判斷鍊錶是否存在環,辦法為 設定兩個指標 fast,slow 初始值都指向頭,slow每次前進一步,fast每次前進二步,如果鍊錶存在環,則fast必定先進入環,而slow後進入環,兩個指標必定相遇。當然,...