c++中如何实现弗洛伊德判圈算法_c++判断链表是否有环
发布时间 - 2026-01-05 00:00:00 点击率:次弗洛伊德判圈算法核心是用slow(步长1)和fast(步长2)双指针遍历单链表,若相遇则有环,若fast遇nullptr则无环;C++实现需先判空和单节点,循环条件为fast&&fast->next,移动后立即比较指针是否相等。
弗洛伊德判圈算法的核心逻辑是什么
它不依赖额外空间,只用两个指针——slow 和 fast,在单链表上同步移动:slow 每次走 1 步,fast 每次走 2 步。如果链表有环,二者必在环内相遇;若 fast 先走到 nullptr,说明无环。
如何用 C++ 实现基础判环(无环返回 false,有环返回 true)
注意边界:空链表或仅一个节点时,fast->next 可能非法,必须先检查 fast 和 fast->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)—— 顺序反了,fast为nullptr时访问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小游戏


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