Floyd 循環檢測算法(快慢指針法/龜兔指針法)
Floyd Cycle Detection Algorithm
Floyd Cycle Detection Algorithm,即 Floyd 循環檢測算法,又稱快慢指針法、龜兔指針法。該算法用於判斷鏈表是否存在環,以及判斷環的起點與長度的算法。
算法原理
該算法基於兩個指針,從頭開始遍歷,一個指針跑得快,另一個指針跑得慢,其中快指針的速度是慢指針的2倍。只要存在環,無論快慢指針從哪裡開始,那麼快慢指針最終一定會相遇,因為快指針沒走一次,都會向慢指針靠近一個節點。
算法應用
判斷是否有環
如果存在環,快慢指針必定相遇,反之,如果慢指針走到結尾還沒相遇則不存在環。
求環的長度
假設存在環,那麼快慢指針必定相遇,假設快慢指針在 X 點第一次相遇,此時再讓兩指針前進,下次相遇時快指針比慢指針多走了一圈,由此即可計算出環長度。
求環的起點
當快慢指針第一次相遇後,將慢指針指向頭節點,快指針指向相遇點的下一個節點。再次讓快慢指針運動,當快慢指針再次相遇時,相遇點即為環的第一個節點。