我在 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 循环时,我们不是总是会达到条件(更快 == 更慢)吗?我们已经初始化了更快和更慢,以指向它指向的相同位置。
其次,为什么我们还要比较 if (faster->next == slow),难道我们还不够 justfaster == slower
吗?