# 方法一 (hash)
listnode *detectcycle(listnode *head)
return null;
}
# 方法二 (快慢指標)
listnode *detectcycle(listnode *head)
if (!fast || !fast->next)
return null;
slow = head;
while (slow != fast)
return fast;
}
解釋一下:
快指標每次走2,慢指標每次走1,快指標走的距離是慢指標的兩倍。而快指標又比慢指標多走了一圈。所以head到環的起點+環的起點到他們相遇的點的距離 與 環一圈的距離相等。現在重新開始,head執行到環起點 和 相遇點到環起點 的距離也是相等的,相當於他們同時減掉了 環的起點到他們相遇的點的距離
推算公示也很簡單:
單向鍊錶是否有環以及入環起點節點
判斷乙個鍊錶是否有環就有點像判斷乙個小數是否為迴圈小數。如 12.3756954756954.迴圈體為756954進入節點為7。如果我們從這個思路來考慮那就走遠了。因為,可能這個迴圈體長度特別長,而這個迴圈體中又可能存在很多小的迴圈體。比如 1.1235353512791235353512791.如...
如何判斷單向鍊錶有環?
昨天去面試了一把,面試官給出了這道題。當時我知道一定有什麼巧妙的辦法,但是我並沒有想到。我只是想到了通用的方法,順序遍歷然後為遍歷過的節點依次做標誌。也試圖去想了些特殊的訪法,不過都有一定的侷限性。事後得知了下面這個較優的方案。typedef struct nodetag node 題目 如何判斷單...
單向鍊錶判斷是否有環
如何最有效的檢查單向鍊錶中是否包含了環。請避免使用額外的記憶體。先給出答案吧 定義兩個指標。指標a從鍊錶開始處每次向後移動一個節點。指標b從鍊錶開始處每次向後移動兩個節點。問題的關鍵是乙個單項鍊表中只可能有乙個環,並且指標一旦進入環中就無法離開。因此我們可以預期經過一段時間後,a剛好指向環的第乙個節...