特定のリンクリストでループの開始ノードを見つける方法は?これをサイクルポイントと呼びましょう
これまでのところ、私は次のことを理解しています(低速/高速ポインタを使用):
- リストにループされていないサイズの部分があると仮定します
k
- ゆっくり動くkステップ
- 速い動き2kステップ
- 速いのは(2k-k)=遅いの
k
ステップahead
- 遅いのはループの始まりです。としても知られている
Cycle point
- 速いとは、この時点でのポインタからの
(LOOP_LENGTH - k)
ステップまたは遅いポインタです。behind
Cycle point
- 1ステップのスロームーブごとに、ファストムーブは2ステップ、スローは1ステップずつ増加します。
- したがって、
(LOOP_LENGTH - k)
ゆっくりと衝突するためには速いステップが必要です - これは私が理解していないステップです
。この衝突点では、両方のノードが
k
ループの前からのステップになります。 - 衝突点が見つかったら、1つのポインターをリストの先頭に移動します。
- 次に、衝突するまで1ステップ/回転の速度で両方のポインターを移動します。それらが両方とも出会うノードはループの始まりであり、したがって
Cycle point
誰かが私にステップ9以降を説明してもらえますか?
ありがとう
編集:
私が指摘したいことの1つは、ループ内に入ると、高速が低速ポインターを追い抜くことは決してないということです。彼らは衝突します。その理由は次のとおりです。低速はiで、高速はi-1であると想定しています。それらが移動すると、slow => i+1とfastもi+1になるため、衝突します。または、低速はiで、高速はi-2です。次の動き、遅い-> i + 1; 高速:i。次の動き、遅い-> i + 2、速い:i + 2、したがって再び衝突。とても速いので遅い追い越しはできません。ループ内で一度だけ衝突します!