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

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

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

imJackJia发布于 2026/3/26更新于 2026/4/242 浏览
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. 🎯 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • 💰 8折买阿里云服务器限时8折购买
  • 🦞 5分钟部署阿里云小龙虾了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • AIGC 赋能插画创作:技术解析与代码实战
  • Flutter 三方库 xpath_selector 在鸿蒙系统的适配与使用指南
  • 西门子 S7-1200 PLC 与爱普生机器人 Modbus TCP 通讯配置
  • 堆(Heap)的实现:基于完全二叉树的顺序存储与调整算法
  • Web IM 聊天信息加密算法:三种实现方案对比
  • 前端开发终极资源宝库:gh_mirrors/fr/frontend-stuff 完整指南
  • AR眼镜光学镜头设计实例与核心技巧解析
  • VS Code Java 开发环境配置指南:JDK 至 Spring Boot 插件
  • Python 构建 OKX 加密货币量化交易系统实战
  • GitHub Copilot 学生认证申请指南与常见问题排查
  • FPGA 摄像头采集处理显示指南:OV5640 到 HDMI 实时显示
  • 多线程数据竞争解析:互斥锁与原子操作原理及实践
  • Windows 安装 OpenClaw 配置 Qwen 及 Ollama 本地模型接入飞书机器人
  • Java 基本数据类型详解:类型、范围及转换规则
  • WhisperX 语音识别工具从零开始部署与配置指南
  • Git 代码上传至 GitHub 完整指南
  • C++高性能计算实战:多线程 SIMD 内存池与并发数据结构
  • B 站直播间自动化搭建:弹幕机器人功能配置指南
  • 强化学习与大模型融合:从理论到机器人实践全解析
  • 大模型时代的人才需求与核心岗位分析

相关免费在线工具

  • 加密/解密文本

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