リストが循環的かどうかを確認しようとする C の次のコードがあります。
bool findCircular(Node *head)
{
Node *slower, * faster;
slower = head;
faster = head;
while(true) {
// if the faster pointer encounters a NULL element
if( !faster || !faster->next)
return false;
//if faster pointer ever equals slower or faster's next
//pointer is ever equal to slow then it's a circular list
else if (faster == slower || faster->next == slower)
return true;
else{
// advance the pointers
slower = slower->next;
faster = faster->next->next;
}
}
}
その一部についていくつか質問があります。最初に while ループに入ったとき、常に条件 (速い == 遅い) に到達するのではないでしょうか? 頭を指す同じ場所を指すように、高速と低速の両方を初期化しました。
そして第二に、なぜ (速い->次 == 遅い) の場合も比較したいのfaster == slower
ですか?