跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

LeetCode 141:环形链表判断的两种解法

环形链表检测常用哈希表与快慢指针两种方案。哈希表法通过记录访问节点判断循环,时间 O(n),空间 O(n)。快慢指针法利用双指针速度差,相遇即有环,时间 O(n),空间 O(1)。实现时需处理空指针及单节点等边界情况,确保健壮性。

imJackJia发布于 2026/3/26更新于 2026/10/2687 浏览
LeetCode 141:环形链表判断的两种解法

🌀 环形链表:当数据开始循环舞蹈

在数据结构的世界里,链表是最基础的结构之一。正常链表像一条单行道,从头节点(head)出发,每个节点指向下一个,最终遇到空指针(nullptr)结束旅程。

但环形链表打破了这种线性规则。某个节点的 next 指针不再指向 null,而是回指到链表中已存在的某个节点,形成了一个闭环。检测这种结构是否存在环,是面试中的经典考题。

🔍 解法一:哈希表法 - 空间换时间

核心思路

最直观的方法是记录所有访问过的节点。我们可以使用一个集合来存储遍历过程中遇到的节点地址。如果再次遇到集合中已有的节点,说明存在环;如果遍历到空指针,则无环。

bool hasCycle(ListNode *head) {
    std::unordered_set<ListNode*> visited;
    while (head != nullptr) {
        if (visited.count(head)) {
            return true; // 发现重复访问,存在环
        }
        visited.insert(head);
        head = head->next;
    }
    return false; // 正常到达终点,无环
}

性能分析

  • 时间复杂度:O(n)。最坏情况下需要遍历整个链表。
  • 空间复杂度:O(n)。需要额外存储所有访问过的节点。

这种方法逻辑简单,容易理解,但在内存敏感的场景下不是最优解。

🏃‍♂️ 解法二:快慢指针法 - 龟兔赛跑的智慧

核心思路

受寓言故事启发,我们让两个指针以不同速度移动。慢指针每次走一步,快指针每次走两步。如果链表有环,快指针终将追上慢指针;如果没有环,快指针会先到达终点。

bool hasCycle(ListNode *head) {
    if (head == nullptr || head->next == nullptr) {
        return false;
    }
    ListNode* slow = head;
    ListNode* fast = head->next;
    
    while (slow != fast) {
        if (fast == nullptr || fast->next == nullptr) {
            return false; // 快指针到达终点,无环
        }
        slow = slow->next;      // 乌龟每次一步
        fast = fast->next->next; // 兔子每次两步
    }
    return true; // 相遇,存在环
}

性能优势

  • 时间复杂度:O(n)。线性时间解决问题。
  • 空间复杂度:O(1)。仅需两个指针变量,常数空间。

这是空间最优解,也是业界推荐的标准写法。它体现了双指针技巧在链表问题中的威力。

💻 代码实现与调试心得

在实际编码时,有几个坑需要注意:

  1. 边界条件:空链表或单节点链表直接返回 false,避免空指针异常。
  2. 判空顺序:检查 fast->next 前必须先确认 fast 不为空,防止段错误。
  3. 偶数长度陷阱:如果只判断 fast != nullptr,在偶数长度且无环的链表中可能漏掉终止条件,必须同时检查 fast->next。

调试初期我常忽略 fast->next 的判空,导致在特定测试用例上崩溃。加上这个检查后,代码健壮性显著提升。

🎯 总结

环形链表检测是链表操作中的必考题,两种方法各有侧重:

  • 哈希表法:直观易懂,适合快速验证逻辑,但占用额外内存。
  • 快慢指针法:空间效率极高,是工程实践中的首选方案。

掌握这两种思路,不仅能解决 LeetCode 141 题,更能为处理更复杂的链表问题打下坚实基础。记住,有时候跑得快的兔子确实能教会我们很多!

目录

  1. 🌀 环形链表:当数据开始循环舞蹈
  2. 🔍 解法一:哈希表法 - 空间换时间
  3. 核心思路
  4. 性能分析
  5. 🏃‍♂️ 解法二:快慢指针法 - 龟兔赛跑的智慧
  6. 核心思路
  7. 性能优势
  8. 💻 代码实现与调试心得
  9. 🎯 总结

更多推荐文章

查看全部
  • JDK 核心实操指南:从安装配置到项目打包调试全流程
  • Flutter 三方库 vertex_ai 的鸿蒙化适配指南
  • 前端地图开发基础:服务类型、坐标系与 SDK 选型
  • Neo4j 在 Windows 上的安装与配置教程
  • 两数之和:暴力枚举与哈希表优化
  • 深入理解 IDE 中 AI 大模型的 Session 机制与管理策略
  • OpenClaw 多 Agent 与飞书机器人配置指南
  • YOLO-DRONE 无人机低空巡检模型实测与电力部署解析
  • Python PDB 调试工具详解
  • Python 语言在网络安全入门中的应用与学习路线
  • Electron 与 Flutter 跨平台开发框架全面对比
  • 大模型时代机器学习工程师薪资与职业发展分析
  • Llama 开源家族演进:从 Llama-1 到 Llama-3 深度解析
  • Web 安全漏洞挖掘技巧与实战指南
  • Adoptium Temurin JDK 安装与配置指南
  • DeerFlow 2.0 生产级 AI Agent 框架的 Docker 部署与并行编排
  • Web 火车票务管理系统的设计与实现
  • Mac 电脑安装 ADB 环境完整指南
  • 算法实战:一维与二维前缀和模板详解
  • 人工智能产品经理核心技能与十种常用算法解析

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online