判斷一條單鏈表是否有環

2021-06-21 12:10:52 字數 630 閱讀 5695

這道題作為考察程式設計師的基本資料結構-鍊錶的操作和演算法是一道不錯的題,也是一道經常面試到的一道題,我從網上查了一下,這裡只寫一下演算法思想,實現由讀者自己去實踐下,下面轉入正題:

已知頭結點,判斷一條單鏈表是否有環可用三種方法,演算法思想如下:

1.追趕法。設兩個指標,乙個快指標(步長為2),乙個慢指標(步長為1),從頭開始遍歷。

2.查表法。把遍歷過的指標放到另乙個表中,每次遍歷的新結點與已遍歷過的結點對比,若有相同的結點說明有環,若到結尾仍未發現有相同的結點,是視為無環。

3.反轉法。是使用反轉指標的方法,每過乙個節點就把該節點的指標反向。當有環的時候,最後指標會定位到鍊錶的頭部,如果到最後,都沒有再到頭部,那說明鍊錶不存在迴圈。

由此引申出來的問題在家有:

1)環有多長?

2)求出環的連線點

3)帶環鍊錶的長度

以追趕法為例來說一下我解決這三個問題的演算法,至於什麼有什麼定理做依據就不再闡述,讀者要是有什麼好的演算法一定要不吝賜教。

1)以碰撞點為始點往下遍歷,若有環定會回到此碰撞點,那麼再次回到此碰撞點經過的結點個數就是環的長度。

2)從頭結點開始,每往下遍歷乙個結點都與環上的結點對比,若與環中的某個結點一樣,則此結點就是該環的連線點。

3)由1)和2)不難得出。

判斷單鏈表是否有環

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...

判斷單鏈表是否有環

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