You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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的作用
    这个条件是第一层防护:

    1. 如果链表本身是空链表(head为nullptr),初始化后的fast就是nullptr,直接跳过循环返回false,避免后续访问fast->next触发崩溃。
    2. 当链表无环且长度为奇数时,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 07:35:24