我在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
就不够? 最佳答案
不要同时从faster
开始slower
和head
。进行错误检查,然后从faster
启动head->next
。
该算法应在没有faster->next ==slower
的情况下工作。
关于c - 对查找循环列表算法的怀疑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14860577/