为何Floyd循环检测算法中要使用fast!=nullptr && fast->next!=nullptr两个条件?
Floyd循环检测算法中
fast != nullptr && fast->next != nullptr条件的作用解释 先看你提供的检测代码:
int detectCycle(Node *& head) { Node * fast = head; Node * slow = head; while(fast!=nullptr && fast->next!=nullptr) // 你困惑的两个条件 { slow = slow->next; fast = fast->next->next; if(fast == slow) return 1; } return false; }
这两个条件的核心目的是避免空指针访问错误,同时准确判断链表是否不存在循环,下面分别拆解:
fast != nullptr的作用
这个条件是第一层防护:- 如果链表本身是空链表(
head为nullptr),初始化后的fast就是nullptr,直接跳过循环返回false,避免后续访问fast->next触发崩溃。 - 当链表无环且长度为奇数时,
fast会最终走到链表末尾的nullptr,此时循环终止,说明没有环。比如链表是1->2->3->null,fast的路径是1→3→null,第三次循环判断fast为nullptr后退出。
- 如果链表本身是空链表(
fast->next != nullptr的作用
这个条件是为了处理无环链表的偶数长度场景:
当链表无环且长度为偶数时,fast在倒数第二步会停在倒数第二个节点,此时fast->next是最后一个节点(非空),但如果没有这个判断,执行fast = fast->next->next时,就会访问最后一个节点的next(也就是nullptr)的next,直接触发空指针错误。比如链表是1->2->null,fast初始在1,第一次循环后走到2->next即nullptr,第二次循环判断fast为nullptr后退出;如果没有这个条件,当链表是1->null时,fast是1,进入循环后执行fast = fast->next->next,就是访问nullptr->next,直接崩溃。
简单来说,这两个条件组合起来,覆盖了所有无环链表的边界情况(空链表、奇数长度、偶数长度),确保在fast指针还能安全跳两步的时候才继续循环,一旦无法安全跳跃,就说明链表没有环,直接终止循环返回结果。
内容的提问来源于stack exchange,提问作者Athar Mujtaba Wani
相关产品推荐
相关产品推荐

