找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

264

积分

0

好友

32

主题
发表于 16 小时前 | 查看: 3| 回复: 0

快慢指针判环详解:LeetCode141环形链表(C++) - 图片 - 1

本文介绍一种检测链表是否存在环的高效方法:快慢指针(Floyd 判圈)。该方法在不额外占用空间的前提下,可在 [O(n)] 时间复杂度内完成判断,适用于面试与工程中对链表结构的健壮性检测。

在学习本题前,建议先补齐基础的算法/数据结构知识点(链表、指针移动、复杂度分析)。

题目描述

给定一个链表,判断链表中是否有环。

为了表示给定链表中的环,我们使用整数 pos 表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos-1,则该链表中没有环。

示例

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

在这里插入图片描述

思路解析:快慢指针判环

核心思想是用两个指针以不同速度在链表上移动:

  • slow:每次走 1 步
  • fast:每次走 2 步

若链表存在环,fast 终将追上 slow,两者会在环内某个节点相遇;若不存在环,fast 会先到达 nullptr,循环结束。

进阶也建议掌握:  

  • 为什么有环时快慢指针一定会相遇  
  • step=2 能相遇,那么 step=n(如 n=3)是否也能相遇  
  • 如何找到环的入口节点

参考代码(C++)

注意:这里 fasthead->next 开始,是一种常见写法,可避免初始即 slow==fast 的干扰判断。

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    bool hasCycle(ListNode *head) {
        if (head == nullptr) {
            return false;
        }
        ListNode * slow = head;
        ListNode * fast = head->next;  // fast指针要这么写
        while (fast && fast->next) {
            // 慢指针每次走一步,快指针每次走两步
            slow = slow->next;
            fast = fast->next->next;
            // 快慢指针能相遇就代表有环
            if (slow == fast) {
                return true;
            }
        }
        return false;
    }
};

快慢指针判环详解:LeetCode141环形链表(C++) - 图片 - 2

复杂度

  • 时间复杂度:[O(n)]
  • 空间复杂度:[O(1)]

如果你在实现中遇到空指针判断、边界条件处理等问题,建议回顾 C++ 指针与链表遍历的细节,这类问题在链表题中非常高频。




上一篇:Go代码现代化:应对AI固化旧模式,详解官方Modernizers与Auto-Inliner工具链
下一篇:嵌入式软件架构分层实战:基于STM32与FreeRTOS的Arch-Platform-Target设计
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-24 17:18 , Processed in 0.250823 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表