如何判斷單向鍊錶有環?

2021-04-13 10:52:11 字數 835 閱讀 3529

昨天去面試了一把,面試官給出了這道題。當時我知道一定有什麼巧妙的辦法,但是我並沒有想到。我只是想到了通用的方法,順序遍歷然後為遍歷過的節點依次做標誌。也試圖去想了些特殊的訪法,不過都有一定的侷限性。事後得知了下面這個較優的方案。

typedef struct nodetag

node;

題目:如何判斷單項鍊表有死迴圈?

答案:定義兩個指標p、q,然後讓p、q同時從煉表頭向後查詢,注意他們移動的步幅是不同的分別為a

、b,例如p指標每次執行一次【p = p->next;】q每次執行兩次【q = q->next;】,如果q先到鏈尾【if(q->next == null)】則沒有死迴圈(這裡假設q比p的移動速度要快),如果p、q在此之前相遇了則有死環。

對於這個答案少不了的還是欣賞,這確實是個good idea.但是返回來一想,會不會有這樣的情況,p與q永遠不會相遇呢?這裡就涉及到a和b應該如何選擇的問題,它們的設定必須要保證如果鍊錶上有死環,p、q一定會在有限的步數內相遇。網上有人說a,b的只要是素數就行,有人說a、b大一點好,但a、b的值到底應該如何選擇呢?

分析:假設鍊錶上有環的情況,按照前面說的方案經過了多次移動以後p和q都會上環,上環後其實就是乙個追逐問題,如果aa】;即【x=(cy-h)/(b-a)】,注意這裡的x一定要是正整數。由於c和h都是隨機數,所以【(cy-h)】的結果可以是任何乙個正整數。問題轉變成了a和b必須滿足任意整數都可以除盡【(b-a)】,這下好了終於可以得出答案:因為任意整數除以1都等於它本身。這裡只要滿足條件【b-a=1】 即可。也就是說p和q的步幅只要相差1就可以保證在有限次迭代後可以找出鍊錶上的環。 

單向鍊錶判斷是否有環

如何最有效的檢查單向鍊錶中是否包含了環。請避免使用額外的記憶體。先給出答案吧 定義兩個指標。指標a從鍊錶開始處每次向後移動一個節點。指標b從鍊錶開始處每次向後移動兩個節點。問題的關鍵是乙個單項鍊表中只可能有乙個環,並且指標一旦進入環中就無法離開。因此我們可以預期經過一段時間後,a剛好指向環的第乙個節...

判斷單向鍊錶是否有環

若單向鍊錶存在環那麼鍊錶的形態為 有環的鍊錶簡單的遍歷走不到尾 那麼我們怎麼判斷有環呢?環就像是操場的的跑到 那麼運動天賦一向不太好的 我很容易就能想到跑步時容易讓人扣圈 同理 我們可以定義兩個指標讓他們同時指向鍊錶的頭 乙個指標一次走兩步 乙個指標一次走一步 那麼如果鍊錶有環那麼他們一定會在環內的...

判斷單向鍊錶是否有環

找出環的入口點 求環的長度 求環上距離任意一點最遠的點 判斷兩個無環鏈表是否相交 判斷相交的位置 給乙個單鏈表,判斷其中是否有環的存在 如果存在環,找出環的入口點 如果存在環,求出環上節點的個數 如果存在環,求出鍊錶的長度 如果存在環,求出環上距離任意乙個節點最遠的點 對面節點 如何判斷兩個無環鏈表...