跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
C++算法

LeetCode 141:环形链表检测的经典解法

综述由AI生成环形链表检测是链表操作中的经典问题。哈希表法直观但占用 O(n) 空间;快慢指针法利用龟兔赛跑原理,仅需 O(1) 额外空间。对比了两种方案的时间复杂度与实现细节,重点讲解了边界条件处理及代码健壮性优化,帮助开发者掌握算法本质。

1951018925发布于 2026/3/26更新于 2026/5/1212 浏览
LeetCode 141:环形链表检测的经典解法

环形链表检测:从基础到优化

在数据结构的世界里,链表是最基础的结构之一。普通链表像一条单行道,从头节点出发,最终指向空指针结束。而环形链表则打破了这种线性规则,某个节点的 next 指针指向了链表中已存在的节点,形成了一个闭环。

方法一:哈希表法

最直观的思路是记录所有经过的节点。就像侦探在地图上钉下标记,每遇到一个新节点就检查是否已经出现过。

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) 的查找效率。

方法二:快慢指针法

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

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(1),时间复杂度同样是 O(n)。它体现了双指针技巧在链表问题中的广泛应用。

调试心得

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

  1. 边界条件:空链表或单节点直接返回 false。
  2. 判空顺序:检查 fast->next 前必须先确认 fast 不为空,否则偶数长度链表可能越界。
  3. 思维与实现:算法思路要清晰,但代码实现必须严谨处理语言特性。

掌握这两种方法,不仅能解决此类题目,更能为处理复杂链表问题打下坚实基础。有时候,跑得快的'兔子'确实能教会我们很多关于效率的道理。

目录

  1. 环形链表检测:从基础到优化
  2. 方法一:哈希表法
  3. 方法二:快慢指针法
  4. 调试心得
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Java Web 开发入门:基础概念、环境搭建与 Servlet/JSP
  • OpenClaw B 端企业级应用实战:CentOS 7 快速部署指南
  • Python 代码检查工具 Ruff 使用指南
  • C++ Google Test (gtest) 全面使用指南
  • PentAGI Docker 环境部署指南
  • 深度学习八大经典神经网络架构详解与实战指南
  • FPGA 开发环境搭建:Quartus II 13.1 与 ModelSim 安装配置指南
  • 算法学习入门指南:数据结构与核心算法实战
  • Ubuntu 远程 SSH 连接配置与 VS Code 使用
  • PDF 压缩工具:纯前端开源本地压缩方案及实现思路
  • 基于 Python 与 AI 的智能害虫识别系统实战
  • Python 调用 Ollama 本地大模型 API 完全指南
  • Spring Cloud Gateway 内置 Filter 实战:AddRequestHeader 与 RewritePath
  • HarmonyOS6 RcInput 组件核心架构与类型系统设计
  • GraphRAG 与 Neo4j 集成实战:数据导入与图谱可视化
  • SQL 表查询与更新操作详解
  • VR 视频转换工具使用指南:实现自由视角与 2D 输出
  • OpenClaw 从零部署到可控 AI Agent 实战指南
  • Linux Shell 脚本正则表达式基础
  • 十大中国流行 AI 大模型企业及平台汇总

相关免费在线工具

  • 加密/解密文本

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