新闻中心
c++怎么判断一个链表是否存在环_c++判断链表环的多种算法实现
答案:快慢指针法通过两个指针判断环,时间O(n)空间O(1);哈希表法用set记录节点,时间O(n)空间O(n);标记法修改节点标记,会破坏结构。推荐快慢指针法。

判
断链表是否存在环是常见的数据结构问题。C++中可以通过多种方法解决,下面介绍三种常用且高效的实现方式:快慢指针法、哈希表法和标记法。
1. 快慢指针法(Floyd判圈算法)
这是最经典的方法,也叫“龟兔赛跑”算法。使用两个指针,一个每次走一步(慢指针),另一个每次走两步(快指针)。如果链表有环,它们最终会相遇;如果没有环,快指针会到达末尾。
优点:时间复杂度 O(n),空间复杂度 O(1)。
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;
}
2. 哈希表法(使用set记录访问节点)
遍历链表,将每个节点的地址存入一个unordered_set中。如果发现当前节点已经在集合中,说明存在环。
优点:逻辑清晰,容易理解。
缺点:需要额外 O(n) 的空间。
NameGPT
免费的名称生成器,AI驱动在线生成企业名称及Logo
119
查看详情
#include <unordered_set>
bool hasCycle(ListNode *head) {
std::unordered_set<ListNode*> visited;
while (head) {
if (visited.find(head) != visited.end()) {
return true;
}
visited.insert(head);
head = head->next;
}
return false;
}
3. 标记法(修改节点值或指针)
利用题目限制较少的特点,可以给每个访问过的节点添加标记。例如将节点的 next 指向一个特殊地址(如头节点本身),或者修改 val 为特殊值(前提是允许修改原链表)。
注意:这种方法会破坏原始结构,不适用于只读场景。
bool hasCycle(ListNode *head) {
while (head) {
if (head->next == head) return true; // 已被标记
ListNode *next = head->next;
head->next = head; // 标记当前节点
head = next;
}
return false;
}
基本上就这些。实际开发推荐使用快慢指针法,无需额外空间且不破坏链表结构,是最优解。面试中能写出这几种方案,体现对时间和空间权衡的理解。
以上就是c++++怎么判断一个链表是否存在环_c++判断链表环的多种算法实现的详细内容,更多请关注其它相关文章!
# 推荐使用
# 淮安短视频优化招聘网站
# 企业网站建设及优化措施
# 全搜索网站建设素材
# 上海市专业网站建设
# 秭归智能营销推广优势
# 携程门店会员营销推广费
# 新区网站运营推广
# 天津建设网站开发
# 甘肃百度关键词排名
# 可乐视频网站建设
# 相关文章
# node
# 遍历
# 已被
# 与其他
# 这是
# 如何使用
# 数据结构
# 是否存在
# 链表
# red
# c++
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
Go语言中JSON数据解析与字段访问教程
Golang如何实现容器化日志收集与分析_Golang容器日志收集分析方法
必由学官网快捷入口 必由学网页版在线学习平台
Yandex免登录网页版地址 Yandex搜索引擎官方访问入口
C++如何实现一个装饰器模式_C++设计模式之动态地给对象添加额外职责
Golang如何使用bytes.Split分割字节切片_Golang bytes切片分割方法
Yandex官网搜索引擎免登录_俄罗斯Yandex一键直达入口
如何在CSS中使用visited与link控制链接颜色_visited link伪类配合
Win11如何使用Windows Sandbox Win11沙盒功能开启与使用教程【详解】
qq邮箱发邮件给国外发不出去_QQ邮箱国际邮件发送失败原因与解决
顺丰快递查单号物流信息 顺丰快递小程序查询入口
从OpenAI API响应中高效提取生成文本
Win10自动更新怎么关闭 Win10永久关闭系统更新的两种方法【终极版】
Mac怎么查看崩溃日志_Mac控制台错误报告分析
微博网页版官方账号登录 微博网页版内容浏览使用指南
蛙漫安全无毒 官方认证的绿色入口
迅雷下载到U盘速度很慢怎么办_迅雷U盘下载慢优化方法
在Qt QML中通过Python字典动态更新TextEdit内容的教程
12306几点到几点不能订票? | 官方最新系统维护时间全解析
抖音极速版最新版本 抖音极速版官方下载地址
高德地图怎么看全景照片_高德地图全景照片浏览教程
拼多多购物车商品数量无法修改如何处理 拼多多购物车操作优化方法
Win11怎么设置开机NumLock亮 Win11修改注册表InitialKeyboardIndicators值
实现全屏滚动与导航点:专业教程
b站怎么看视频的弹幕数量_b站弹幕数量查看方法
Python大型XML文件高效流式解析教程
如何使用Rector自动化升级旧代码_通过Composer安装和配置Rector进行代码重构
必由学官方登录入口 必由学教师学生账号快速访问
Tabulator表格日期时间排序问题及自定义解决方案
如何在 Excel Online 和 Google 表格中更改日期格式
必由学在线入口 必由学网页版快速登录入口
j*a toString()的覆盖
Linux如何排查内存不足OOME问题_LinuxOOM分析教程
知音漫客正版漫画平台_知音漫客官网账号登录
J*aScript设计模式实践_j*ascript代码优化
TikTok搜索结果不显示如何解决 TikTok搜索刷新优化方法
汽水音乐在线解析 汽水音乐在线解析入口
如何使用 Excel 发布器与 Power BI 分享 Excel 洞察
Win11怎么用U盘重装系统 Win11制作启动盘并重装系统完整教程【详解】
一加Ace 6T实拍样张首次公布!李杰:主摄实力完全看齐4K档性能旗舰
J*aScript中localStorage数据的获取、清洗与格式化教程
MongoDB Aggregation:在嵌套对象数组中精确匹配ObjectId
QQ邮箱网页版快速登录 QQ邮箱邮箱账号官方入口地址
mysql通配符支持数字匹配吗_mysql通配符能否用于数字匹配的解析
sublime如何配置Go语言开发环境_sublime搭建Golang编译运行系统
C++如何使用AddressSanitizer(ASan)_C++调试工具中检测内存访问错误的利器
厨房不锈钢水槽发黑生锈怎么处理_水槽用可乐+锡纸2分钟抛亮如新
使用 Pandas 高效处理 .dat 文件:字符清理与数据计算
Mac怎么锁定备忘录_Mac备忘录加密设置教程
深入理解Go语言中Map值与方法接收器的交互:为什么需要临时变量


2025-10-31
浏览次数:次
返回列表