簡介:龜兔賽跑算法,又稱弗洛伊德循環檢測算法,是一種在鏈表中非常常用的算法。它基于運動學和直覺的基本定律。本文旨在向您簡要介紹該算法,并幫助您了解這個看似神奇的算法。
假設高速公路上有兩輛車。其中一輛的速度為 x,另一輛的速度為 2x。它們唯一能相遇的條件是它們都在循環中。恭喜你,你剛剛學會了龜兔算法。
在龜兔算法中,我們讓兩個指針分別為慢指針和快指針(分別是烏龜和兔子)。快指針以 2 的速度移動(每次迭代移動兩個節點),而慢指針以 1 的速度移動(每次迭代移動一個節點)。如果它們相遇,則意味著存在循環。
但是我們怎么知道這兩個指針最終會相遇呢?
現在,我們知道慢速和快速都會在不同的時間進入循環。慢速的速度為 1,因此每次迭代只跳過一個鏈接。快速的速度為 2。因此每次迭代傳遞兩個變量。因此,對于每次迭代,快速都會向慢速移動 1 步,并且由于慢速和快速進入循環時之間的距離總是可以被 1 整除,因此快速將在一次或更短的循環內趕上慢速。
您也可以換一種方式思考。認為慢速指針只是停留在一個位置,整個鏈表以 1 的速度移動。這意味著快速指針相對于慢速指針每次迭代僅以 1 個節點的速度移動。