day134—快慢指针—环形链表(LeetCode-141)

题目描述

给你一个链表的头节点 head ,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递。仅仅是为了标识链表的实际情况。

如果链表中存在环 ,则返回 true 。 否则,返回 false

示例 1:

复制代码
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。

示例 2:

复制代码
输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:

复制代码
输入:head = [1], pos = -1
输出:false
解释:链表中没有环。

提示:

  • 链表中节点的数目范围是 [0, 104]
  • -105 <= Node.val <= 105
  • pos-1 或者链表中的一个 有效索引

解决方案:

这段代码的核心功能是判断单链表中是否存在环形结构 (即链表的某个节点的 next 指向链表中之前的节点,形成闭环),采用「快慢指针(龟兔赛跑)」的经典方法实现,时间复杂度 O(n)、空间复杂度 O(1),是判断链表环的最优解法。

核心逻辑

代码利用快慢指针的运动特性:若链表无环,快指针会先走到末尾;若有环,快慢指针最终会在环内相遇:

  1. 边界预判 :先判断链表为空或只有一个节点,直接返回 false(不可能有环);
  2. 指针初始化 :慢指针 low 和快指针 fast 都从链表头节点 head 出发;
  3. 快慢遍历与相遇判断 :循环条件为 fast 不为空且 fast->next 不为空(保证快指针能走两步):
    • 慢指针 low 每次走 1 步,快指针 fast 每次走 2 步;
    • 若某一时刻 fast == low(快慢指针相遇),说明链表有环,立即返回 true
  4. 无环返回 :若循环结束(快指针走到链表末尾),说明链表无环,返回 false

总结

  1. 核心思路:利用快慢指针步长差(1:2),无环则快指针先到终点,有环则快慢指针必在环内相遇;
  2. 关键细节:循环条件 fast && fast->next 避免快指针访问空指针的 next 导致崩溃;
  3. 效率优势:无需额外空间(如哈希表)存储节点,仅用两个指针完成判断,空间复杂度为 O(1)

函数源码:

cpp 复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    bool hasCycle(ListNode *head) {
        if(head==nullptr || head->next==nullptr){
            return false;
        }
        ListNode* low=head;
        ListNode* fast=head;
        while(fast && fast->next){
            low=low->next;
            fast=fast->next->next;
            if(fast==low) return true;
        }
        return false;
    }
};
相关推荐
海清河晏11121 小时前
数据结构 | 单循环链表
数据结构·算法·链表
wuweijianlove1 天前
算法性能的渐近与非渐近行为对比的技术4
算法
_dindong1 天前
cf1091div2 C.Grid Covering(数论)
c++·算法
AI成长日志1 天前
【Agentic RL】1.1 什么是Agentic RL:从传统RL到智能体学习
人工智能·学习·算法
黎阳之光1 天前
黎阳之光:视频孪生领跑者,铸就中国数字科技全球竞争力
大数据·人工智能·算法·安全·数字孪生
skywalker_111 天前
力扣hot100-3(最长连续序列),4(移动零)
数据结构·算法·leetcode
6Hzlia1 天前
【Hot 100 刷题计划】 LeetCode 17. 电话号码的字母组合 | C++ 回溯算法经典模板
c++·算法·leetcode
wfbcg1 天前
每日算法练习:LeetCode 209. 长度最小的子数组 ✅
算法·leetcode·职场和发展
_日拱一卒1 天前
LeetCode:除了自身以外数组的乘积
数据结构·算法·leetcode
计算机安禾1 天前
【数据结构与算法】第36篇:排序大总结:稳定性、时间复杂度与适用场景
c语言·数据结构·c++·算法·链表·线性回归·visual studio