c++中如何实现弗洛伊德判圈算法_c++判断链表是否有环

发布时间 - 2026-01-05 00:00:00    点击率:
弗洛伊德判圈算法核心是用slow(步长1)和fast(步长2)双指针遍历单链表,若相遇则有环,若fast遇nullptr则无环;C++实现需先判空和单节点,循环条件为fast&&fast->next,移动后立即比较指针是否相等。

弗洛伊德判圈算法的核心逻辑是什么

它不依赖额外空间,只用两个指针——slowfast,在单链表上同步移动:slow 每次走 1 步,fast 每次走 2 步。如果链表有环,二者必在环内相遇;若 fast 先走到 nullptr,说明无环。

如何用 C++ 实现基础判环(无环返回 false,有环返回 true)

注意边界:空链表或仅一个节点时,fast->next 可能非法,必须先检查 fastfast->next 是否为 nullptr

struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(nullptr) {}
};

bool hasCycle(ListNode *head) {
    if (!head || !head->next) return false;

    ListNode *slow = head;
    ListNode *fast = head;

    while (fast && fast->next) {
        slow = slow->next;
        fast = fast->next->next;
        if (slow == fast) return true;
    }
    return false;
}

为什么 fast 要走两步而不是三步或更多

走两步是效率与正确性平衡的结果:

  • fast 走 3 步,可能跳过 slow,导致一次循环内不相遇,需更多轮才能捕获,但不破坏正确性
  • 但走 2 步能保证:只要存在环,相对速度为 1,fast 必然在有限步内追上 slow(数学上可证最多绕环一圈就相遇)
  • 走 >2 步会增加空指针解引用风险(如 fast->next->next->next),且无性能收益

常见误写和崩溃点

最常出错的是循环条件和移动顺序:

  • 错误写法:while (fast->next && fast) —— 顺序反了,fastnullptr 时访问 fast->next 直接段错误
  • 错误写法:先移动再判断(如把 if (slow == fast) 放在移动之后但没处理初始重合)—— 若链表只有一个节点且自环(head->next == head),初始 slow == fast,但未进循环就被跳过
  • 正确做法:循环条件严格为 fast && fast->next,且每次移动后立即判断相等

环检测本身不难,但指针操作的边界稍一松懈就会 crash,尤其是和 LeetCode 测试用例里各种极端结构(空、单节点、自环、长链+小环)打交道时,条件顺序和判空缺一不可。


# node  # c++  # 为什么  # if  # while  # 循环  # 指针  # 空指针  # 算法  # leetcode  # 弗洛伊德  # 链表  # 小环  # 跳过  # 的是  # 就会  # 放在  # 尤其是  # 最多  # 走到 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  如何用PHP工具快速搭建高效网站?  如何在香港服务器上快速搭建免备案网站?  教你用AI将一段旋律扩展成一首完整的曲子  Android实现代码画虚线边框背景效果  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  如何选择PHP开源工具快速搭建网站?  javascript中闭包概念与用法深入理解  Python面向对象测试方法_mock解析【教程】  装修招标网站设计制作流程,装修招标流程?  网页设计与网站制作内容,怎样注册网站?  Laravel中间件如何使用_Laravel自定义中间件实现权限控制  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  香港服务器建站指南:免备案优势与SEO优化技巧全解析  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  如何在阿里云虚拟主机上快速搭建个人网站?  Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  JavaScript如何实现倒计时_时间函数如何精确控制  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  微信小程序 闭包写法详细介绍  Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  香港服务器租用费用高吗?如何避免常见误区?  小米17系列还有一款新机?主打6.9英寸大直屏和旗舰级影像  Laravel怎么清理缓存_Laravel optimize clear命令详解  如何快速辨别茅台真假?关键步骤解析  如何构建满足综合性能需求的优质建站方案?  Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试  Laravel PHP版本要求一览_Laravel各版本环境要求对照  微信小程序 scroll-view组件实现列表页实例代码  如何在阿里云通过域名搭建网站?  Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】  Laravel如何实现本地化和多语言支持?(i18n教程)  如何获取PHP WAP自助建站系统源码?  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  如何撰写建站申请书?关键要点有哪些?  如何用美橙互联一键搭建多站合一网站?  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  创业网站制作流程,创业网站可靠吗?  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  JavaScript实现Fly Bird小游戏