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

LeetCode 141: 环形链表判断算法详解

详细解析 LeetCode 141 环形链表问题。介绍了哈希表法和快慢指针法两种解决方案。哈希表法直观但占用 O(n) 空间;快慢指针法空间复杂度为 O(1),是更优解。文章包含 C++ 代码实现、性能分析及调试注意事项,帮助读者掌握链表环检测的核心技巧。

GRACE Grace发布于 2026/3/30更新于 2026/10/26109 浏览
LeetCode 141: 环形链表判断算法详解

问题背景

在计算机科学中,链表是一种基础数据结构。正常链表从起点 (head) 出发,每个节点指向下一个节点,最终以空指针 (nullptr) 结束。而环形链表打破了线性规则,某个节点不再指向空,而是指向链表中已存在的另一个节点,形成无尽循环。

Head -> Node1 -> Node2 -> Node3 -> Node4
                      ^              |
                      |______________|

解法一:哈希表法

解题思路

记录每一个经过的节点。每当遇到新节点时,检查该地点是否曾经出现过。若发现重复访问,则存在环。

bool hasCycle(ListNode *head) {
    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)需要存储所有访问过的节点

这种方法直观易懂,但需要额外的存储空间。C++ 中的 unordered_set 提供了平均 O(1) 的查找效率。

解法二:快慢指针法

解题思路

受龟兔赛跑寓言启发,让两个指针以不同速度遍历链表。如果存在环,快指针终将追上慢指针;如果不存在环,快指针会先到达终点。

slow: Head -> Node1 -> Node2 -> Node3
fast: Head -> Node2 -> Node4 -> ...
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. 指针移动顺序:先移动指针再判断,避免错过相遇点。
  3. 循环终止条件:快指针或其 next 为 null 时即可确定无环。

调试过程中,最初忽略了 fast->next 的判空,导致在偶数长度链表上报错。添加该检查后代码更加健壮。

总结

环形链表判断是链表操作中的经典问题,两种解法各有千秋:

  • 哈希表法:直观易懂,适合教学和理解问题本质。
  • 快慢指针法:空间高效,体现了算法优化的智慧。

掌握这两种方法,不仅能解决 LeetCode 141 题,更能为处理更复杂的链表问题打下坚实基础。

目录

  1. 问题背景
  2. 解法一:哈希表法
  3. 解题思路
  4. 性能分析
  5. 解法二:快慢指针法
  6. 解题思路
  7. 性能优势
  8. 代码实现与调试心得
  9. 总结

更多推荐文章

查看全部
  • 数据结构(C语言版)第三版 严蔚敏 吴伟民著
  • Git 国内国外下载地址镜像及安装教程
  • AIGC 背后的深度学习魔法:从原理到实践
  • 钉钉 AI 助手集成指南:构建智能办公机器人
  • npm 安装 OpenClaw 遇到 Git 报错的处理方案
  • Spring Boot 数据缓存与性能优化实战
  • RAG 检索增强生成技术入门与实战指南
  • LLMQuant 与 Camel AI 战略合作:探索多智能体系统在量化金融中的应用
  • AI 无人机智慧巡检平台架构与功能解析
  • Hunyuan-MT-7B WebUI 本地部署流程
  • 30 岁转行产品经理可行性分析与入门实战指南
  • 基于 DeepSeek V3.2 与 Go 语言构建智能日志分析系统
  • 基于 PyQT 与高德 JS API 构建桌面三维地形图应用
  • Java JDK 21 安装与环境配置教程(Windows/macOS 通用)
  • 基于 Svelte 的网页版 Mac OS Ventura 项目解析
  • WhisperLiveKit 本地部署实时语音转文字与说话人识别方案
  • CarelessWhisper: 将 Whisper 改造为因果流式语音识别模型
  • C++ 基础:RAII、智能指针与项目构建
  • Linux 新手基础工具指南:软件安装、Vim 操作与 GCC 编译
  • Meta:BackTranslation 与 IBM Self Alignment 技术解析

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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