新闻中心

c++怎么判断一个链表是否存在环_c++判断链表环的多种算法实现

2025-10-31
浏览次数:
返回列表
答案:快慢指针法通过两个指针判断环,时间O(n)空间O(1);哈希表法用set记录节点,时间O(n)空间O(n);标记法修改节点标记,会破坏结构。推荐快慢指针法。

c++怎么判断一个链表是否存在环_c++判断链表环的多种算法实现

断链表是否存在环是常见的数据结构问题。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 NameGPT

免费的名称生成器,AI驱动在线生成企业名称及Logo

NameGPT 119 查看详情 NameGPT
#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值与方法接收器的交互:为什么需要临时变量 

搜索