当前位置: 首页 > news >正文

LeetCode经典题解:环形链表

在刷 LeetCode 的过程中,“环形链表” 是一道经典的链表类基础题目,这道题核心考察对链表遍历和指针操作的理解,难点在于如何不使用额外空间,高效判断链表是否存在环。今天就来分享这道题的高效解法,严格按照题干思路,通过定义快慢指针,利用“快指针走两步、慢指针走一步”的规则遍历链表,根据指针是否相遇判断是否有环,实现时间复杂度 O(n)、空间复杂度 O(1) 的最优解,完美契合题干要求。

题目描述

给你一个单链表的头节点 head,请你判断该链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。如果链表中存在环,返回 true;否则,返回 false。要求不使用额外的哈希表、集合等数据结构存储节点,在 O(n) 时间复杂度、O(1) 空间复杂度内完成解题。

补充说明:链表节点仅包含节点值和下一个节点引用;若链表存在环,环可以位于链表的任意位置(表头、中间、末尾),且环的长度无限制。

解题思路

核心思想是快慢指针追及原理:通过定义两个速度不同的指针(快指针、慢指针),同时从链表头节点出发,快指针每次移动两步,慢指针每次移动一步。若链表存在环,两个指针最终会在环内相遇;若链表不存在环,快指针会率先到达链表末尾,循环终止且两指针不会相遇。

具体核心思路(严格贴合题干要求):

1. 指针初始化:定义快慢指针 fast 和 slow,初始时均指向链表的头节点 head(fast = head,slow = head)。

2. 循环遍历:启动循环,快指针每次走两步,慢指针每次走一步,不断循环遍历链表,循环条件需确保快指针能安全移动(避免空指针异常)。

3. 相遇判断: 当快慢指针相遇(fast == slow)时,说明链表存在环,直接返回 true;如果循环结束(快指针到达链表末尾,无法继续移动两步),依然没有相遇,说明链表不存在环,返回 false。

关键说明:若链表存在环,快慢指针进入环后,由于快指针速度是慢指针的两倍,快指针会不断追赶慢指针,最终一定会相遇(不会出现永远追不上的情况);若有环,循环永远不会因快指针到达末尾而结束,除非两指针相遇,故有环一定会相遇。整个过程仅使用两个指针,不使用额外空间,时间复杂度由遍历次数决定,为 O(n)。

具体步骤

  • 边界判断:若链表为空(head == null)或只有一个节点(head.next == null),则不可能存在环,直接返回 false。

  • 指针初始化:定义快慢指针 fast 和 slow,均赋值为 head(fast = head,slow = head),确保两指针从同一位置出发。

  • 循环遍历与相遇判断:

    • 循环条件:fast != null 且 fast.next != null(确保 fast 能安全移动两步,避免 fast.next 为 null 时,fast.next.next 报空指针异常);

    • 每次循环操作:slow 移动一步(slow = slow.next),fast 移动两步(fast = fast.next.next);

    • 每次移动后判断:若 fast == slow(两指针相遇),说明存在环,立即返回 true;

  • 循环结束:若循环因 fast 到达链表末尾而终止(fast == null 或 fast.next == null),说明两指针始终未相遇,链表不存在环,返回 false。

复杂度分析

时间复杂度:O(n),其中 n 是链表的长度。若链表不存在环,快指针会遍历链表一次(O(n))后到达末尾,循环终止;若链表存在环,快慢指针会在环内相遇,总遍历次数不超过链表长度(快指针最多比慢指针多走一圈环,总步数仍为 O(n)),因此整体时间复杂度为 O(n),符合题干要求。

空间复杂度:O(1),仅使用了 fast 和 slow 两个指针,没有使用哈希表、集合、额外链表等复杂数据结构,完全实现了题干要求的空间优化目标(除必要指针外,无任何额外空间消耗)。

Java 代码

public class Solution { public boolean hasCycle(ListNode head) { // 保证指针都从同一起点出发 ListNode slow = head; ListNode fast = head; while(fast != null && fast.next != null){ slow = slow.next; fast = fast.next.next; if(fast == slow){ return true; } } return false; } }

代码解析

链表节点定义说明

题目默认链表节点类 ListNode 已定义,包含 val(节点值)和 next(下一个节点引用)两个属性,构造方法用于初始化节点值,next 初始为 null。

初始化与边界判断

  • 边界判断:if (head == null || head.next == null) return false; 空链表没有任何节点,单个节点的 next 为 null,均无法形成环,直接返回 false,避免无效遍历和空指针异常。

  • ListNode fast = head; ListNode slow = head; 初始化快慢指针,均指向链表头节点,符合题干“初始时均指向 head”的要求,确保两指针从同一位置开始移动。

循环遍历与相遇判断核心逻辑

while (fast != null && fast.next != null):循环条件是解题的关键,确保 fast 能安全移动两步——若 fast 为 null 或 fast.next 为 null,说明快指针已到达链表末尾,无法继续移动两步,循环终止。

  • slow = slow.next; 慢指针每次移动一步,严格遵循题干要求。

  • fast = fast.next.next; 快指针每次移动两步,与慢指针形成速度差,为环内相遇提供条件。

  • if (fast == slow) return true; 每次移动后立即判断两指针是否相遇,若相遇,说明链表存在环,直接返回 true,无需继续遍历,提升效率。

返回结果

return false; 若循环正常终止(fast 到达链表末尾),说明两指针始终未相遇,链表不存在环,返回 false,符合题干判断逻辑。

示例验证

示例1:存在环的链表(head = [3,2,0,-4],环位于节点 2 和 -4 之间),逐步验证解题过程,贴合题干思路:

1. 边界判断:head != null 且 head.next != null,进入后续操作。

2. 初始化:fast = 3,slow = 3。

3. 循环遍历与相遇判断: 第1次循环:slow=2,fast=0 → 不相遇;第2次循环:slow=0,fast=2 → 不相遇;第3次循环:slow=-4,fast=-4 → 两指针相遇,返回 true,判定存在环。

关键说明:由于存在环,循环不会因 fast 到达末尾而终止,最终快慢指针必然相遇,符合题干“有环一定会相遇”的逻辑。

示例2:不存在环的链表(head = [1,2]),验证过程:

  • 初始化:fast=1,slow=1;

  • 第1次循环:slow=2,fast=null(fast.next.next 为 null);

  • 循环终止,两指针未相遇,返回 false,判定不存在环。

示例3:单个节点(head = [1]),边界判断直接返回 false;示例4:空链表,返回 false,结果均正确。

总结

这道题的核心是利用快慢指针的速度差,实现环形链表的高效判断,完全贴合题干给出的解题思路,既避免了额外空间的使用,又保证了时间效率。关键点总结(贴合题干重点):

  • 指针初始化关键:fast 和 slow 初始均指向 head,确保两指针从同一位置出发,为后续追及相遇奠定基础。

  • 速度规则严格:慢指针每次走1步、快指针每次走2步,是两指针能在环内相遇的核心(速度差为1,快指针会逐步追上慢指针)。

  • 相遇逻辑严谨:若链表存在环,快慢指针进入环后,快指针速度更快,必然会追上慢指针并相遇,且循环不会提前终止;若不存在环,快指针会率先到达末尾,循环终止且无相遇。

  • 复杂度控制到位:时间复杂度 O(n),遍历次数不超过链表长度;空间复杂度 O(1),仅使用两个指针,完全符合题干要求。

这种快慢指针的思路,是判断环形链表的最优解法,不仅适用于本题,还可以迁移到“寻找环形链表的入口”等进阶链表题目中,掌握这种思路能有效提升链表类题目的解题效率和指针操作能力,希望能帮助大家理解和掌握~

http://www.jsqmd.com/news/438164/

相关文章:

  • 药物靶点垂钓:共价vs非共价结合的鉴定逻辑与核心筛选技术盘点
  • 有机废气治理厂家的破局之道:从政策驱动到技术引领 - 品牌评测官
  • AI写论文工具精选!8款一键生成论文的软件排行榜,一键搞定初稿+查重率! - 掌桥科研-AI论文写作
  • C++通过pybind11与Python互调
  • 分析下传动数控折弯机,推荐江苏地区靠谱又好用的品牌 - myqiye
  • 2026家用美白护龈牙膏实测去渍亮白护龈适合全年龄段使用 - 资讯焦点
  • 2026年3月青岛延缓近视眼镜公司推荐,行业权威盘点与品质红榜发布 - 品牌鉴赏师
  • 2026年3月知名环保级板材品牌推荐:环保与性能赋能健康家居 - 资讯焦点
  • 豆包广告联系方式:如何在豆包 AI 搜索结果中占据推荐位? - 品牌2026
  • 西安性价比高的生日礼物店排名,快来看看! - 工业品网
  • 东莞性价比高的AI搜索推荐服务,值得选购的有哪些? - 工业推荐榜
  • 2026招标采购平台实力推荐:e交易全流程服务,涵盖招标采购信息、工具、流程管理 - 品牌推荐官
  • 卡券回收平台怎么选?记住这5点,再也不被骗 - 资讯焦点
  • 掌握AI写教材方法,低查重率不是梦,快速生成高质量教材
  • SolonCode v0.0.18 发布 - 终端智能助手(或编码智能体)
  • spring源码学习(一)spring基本使用之IOC
  • 在工具泛滥的时代,意义是最稀缺的资源专知智库OPC研究院:为什么意义如此重要?与东方之“道”、西方哲学的关系
  • 2026年全屋定制板材实力供应商推荐,西南地区靠谱品牌排名 - 工业设备
  • 力扣热题100实战 | 第19期:删除链表的倒数第 N 个结点——快慢指针的经典配合
  • 2026大字符喷码机公司推荐,满足多样生产需求,喷码机/激光喷码机/大字符喷码机,大字符喷码机公司找哪家 - 品牌推荐师
  • 专知智库OPC研究院用“意义重合”回答:人的意义,在于让个人的热爱与产业的需要、自我的价值与社会的贡献,在那个点上重合。
  • 自动驾驶车辆运动控制:PID参数优化的奇妙之旅
  • 湖南嘉陈商贸教室课桌椅好用吗,价格大概多少钱? - mypinpai
  • 2026儿童票在哪个平台买有优惠?实用购票攻略分享 - 品牌排行榜
  • NETCORE - IdentityServer4 相关文档
  • 力扣热题100实战 | 第18期:四数之和——从三数到四数的进阶之路
  • 一人公司:意义重合最理想的实践场域,专知智库OPC研究院研究发现了一个根本性的真相
  • 说说江苏地区提取浓缩装置优质服务厂家排名,哪家更靠谱? - 工业品牌热点
  • 团团收教你山东一卡通回收技巧:轻松获得高回报 - 团团收购物卡回收
  • 土耳其投资新机遇:Kurucuk Associates 专业法律服务