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;
    }
};
相关推荐
Klong.k10 分钟前
判断是不是素数题目
数据结构·算法
QQsuccess11 分钟前
AI全体系保姆级详讲——第一部分:了解AI基本定义
人工智能·算法
_日拱一卒14 分钟前
LeetCode:移动零
算法·leetcode·职场和发展
A923A27 分钟前
【洛谷刷题 | 第四天】
算法·前缀和·贪心·洛谷·差分
bai_lan_ya40 分钟前
使用linux的io文件操作综合实验_处理表格
linux·服务器·算法
计算机安禾44 分钟前
【C语言程序设计】第36篇:二进制文件的读写
c语言·开发语言·c++·算法·github·visual studio code·visual studio
ZPC82101 小时前
OLOv11 + 深度相机的方案实现高精度3D定位
人工智能·数码相机·算法·机器人
_日拱一卒1 小时前
LeetCode:字母异位词分组
算法·leetcode·职场和发展
Dfreedom.1 小时前
机器学习经典算法全景解析与演进脉络(监督学习篇)
人工智能·学习·算法·机器学习·监督学习
Zaly.1 小时前
【Python刷题】LeetCode 3567 子矩阵的最小绝对差
python·leetcode·矩阵