判斷單鏈表中是否有環

2021-10-16 04:26:33 字數 625 閱讀 8336

單鏈表中的迴圈鍊錶尾結點不一定指向頭結點,也可以指向任意中間結點。

此時若想判斷單鏈表中是否有環,就不能只是簡單的根據尾結點的next是不是頭結點來判斷,

在此我提供三種方法:

方法一:

建立兩個指標p和q,其中p用來遍歷指標,每次只走一步,並記錄從根節點出發所走的步數,而q則是每次從根節點出發,到達p此時所在的位置,並記錄步數,判斷二者的步數是否相同來判斷鍊錶中是否有回環。

如圖所示,6的下個結點是3,此時p從6到3,走了7步,而q從頭結點走到3只需要3步,步數不相同,則說明有回環。

方法二:

對方法一進行改進,兩個指標進行遍歷時,q會造成很多時間浪費,因此單對判斷鍊錶是否有環來說,可以對結點進行改變,使得每個結點多出位置用來存放步數,對整個鍊錶進行遍歷,並填寫步數,若步數不為空,說明此結點以及遍歷過,說明有環。

方法三:

利用快慢指標,第乙個指標以第二個指標的兩倍速度進行遍歷,若沒有環,則二者永遠不可能相遇,若有環,則在某個時刻總會有二者結點相同。

判斷單鏈表中是否有環

define crt secure no deprecate include include include include define ok 1 define error 0 define true 1 define false 0 typedef int status 函式結果狀態 如ok。t...

判斷單鏈表是否有環

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

判斷單鏈表是否有環

鍊錶結構 struct list 1 判斷單鏈表是否有環 採用追趕法,設定兩個指標p和q,從煉表表頭開始,p每一步走兩個節點,q每一步走乙個節點,如果鍊錶有環則p和q必相遇。如下 判斷鍊錶是否有環,時間複雜度o n 空間複雜度o 1 list hasloopinlist list head else...