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

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

环形链表检测是链表操作中的经典问题。哈希表法通过记录访问节点判断环,空间复杂度 O(n);快慢指针法利用龟兔赛跑原理,仅需常数空间 O(1)。两者时间复杂度均为 O(n),实际开发中推荐优先使用快慢指针以优化内存占用。

t ag发布于 2026/3/29更新于 2026/10/2585 浏览
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)需存储所有访问过的节点

方法二:快慢指针法

这是更优的方案,灵感来自'龟兔赛跑'。让两个指针同时从头出发,一个每次走一步(慢),一个每次走两步(快)。如果存在环,快指针终将追上慢指针;如果不存在环,快指针会先到达终点。

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; // 相遇,存在环
}

这里有个细节需要注意:初始化时 fast 设为 head->next 可以避免进入循环前就判相等,当然也可以都从 head 开始并在循环内先移动再判断。关键是边界条件处理要严谨。

指标值说明
时间复杂度O(n)线性时间解决问题
空间复杂度O(1)仅需两个指针,常数空间

调试心得

在实际编码中,有几个坑值得注意:

  1. 边界检查:空链表或单节点链表直接返回 false。
  2. 判空顺序:检查 fast->next 之前必须先确认 fast 不为空,防止空指针异常。
  3. 逻辑清晰:思维层面确定规律后,实现时要仔细处理语言特性带来的边界差异。

掌握这两种方法,不仅能解决此类题目,更能培养对链表结构的敏感度。

目录

  1. 环形链表判断的两种经典解法
  2. 方法一:哈希表法
  3. 方法二:快慢指针法
  4. 调试心得

更多推荐文章

查看全部
  • AI 变现真相:为何掌握大量工具仍难获利
  • 基于 Java 与 Vue 的大学生理财记账贷款系统
  • 鸿蒙 HarmonyOS 开发技术入门与实战指南
  • 计算机研究生就业现状分析与Python全栈学习路径
  • CATE 条件平均处理效应估计:五大方法原理详解与 Python 实战
  • OpenAI 发布首款 AI 原生浏览器 ChatGPT Atlas
  • 鸿蒙 APP 开发:性能优化与 Next 原生合规
  • Android 开发核心知识点笔记:从基础原理到算法面试实战
  • 基于 Java 的外卖点餐系统设计与实现
  • Android 开发进阶指南:核心技能与避坑建议
  • 基于 Semantic Kernel 与 Pandora Box 快速构建 Code Agent
  • Java 并发性能优化:如何避免伪共享
  • 面试高频问题:线上问题解决经验整理
  • Java 核心面试题与实战解析
  • Java AOP 技术详解
  • C++ 类和对象进阶:构造、析构与运算符重载
  • llama.cpp 大模型本地部署指南
  • Xcode 原生集成 AI 大模型配置与使用指南
  • Llama-Factory 快速迭代 NLP 模型微调指南
  • 解决 Spring Boot 项目中 JUnit 版本冲突引发的 NoSuchMethodError 异常

相关免费在线工具

  • 加密/解密文本

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