环形链表(快慢指针)

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

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

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

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

提示:

  • 链表中节点的数目范围是 [0, 104]
  • -105 <= Node.val <= 105
  • pos-1 或者链表中的一个 有效索引
cpp 复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 typedef struct ListNode LN;
bool hasCycle(struct ListNode *head) {
    LN* fast,* slow;
    fast=slow=head;
    while(fast && fast->next)
    {
        slow=slow->next;
        fast=fast->next->next;
        if(slow==fast)
        {
            return true;
        }
    }
    return false;

}

1.问:slow走一步fast走俩步一定能追上吗?

1答:

假设这个链表就是带环链表,如上图fast追slow,假设上图是距离是N那么,slow继续走一步fast走两步那么这里的距离就是N-1,以此类推N-2,N-3,N-4.....N最终就会是0所以fast一定能追上slow,换言之他们的速度差就一定可以追上

2.问:slow走1步fast走三步能追上吗?

假设这个链表就是带环链表,如上图fast追slow,假设上图是距离是N那么slow继续走一步fast走3步那么他们的速度差就是2这里就要分成俩种情况

N:奇数

N-2,N-4.....3...1...-1

也就是说fast永远在slow左右俩边反复横跳永远不能在一起

N:偶数

N-2,N-4.....4...2...0

当N为偶数的情况下他们最终都会相遇

相关推荐
gugucoding7 小时前
31. 【C语言】堆栈与队列的实现
c语言·开发语言·数据结构·链表
ChaoZiLL8 小时前
我的数据结构3——链表(link list)
数据结构·链表
王老师青少年编程9 小时前
2026年6月GESP真题及题解(C++七级):消消乐
数据结构·c++·算法·真题·gesp·2026年6月
海清河晏11110 小时前
数据结构 | 二叉搜索树
数据结构·c++·visual studio
Yang_jie_0311 小时前
笔记:数据结构(顺序表)
数据结构·windows·笔记
一个初入编程的小白15 小时前
数据结构:栈
数据结构
我命由我1234516 小时前
方差(实例实操、与标准差的区别)
java·数据结构·算法·数据分析·java-ee·intellij-idea·idea
努力努力再努力wz16 小时前
【高性能网络库与HTTP Server系列】:基于主从 Reactor 模型实现高性能 C++ 网络库与 HTTP Server
开发语言·网络·数据结构·数据库·c++·网络协议·http
什巳16 小时前
JAVA练习275-乘积最大子数组
java·开发语言·数据结构·算法
码完就睡18 小时前
数据结构——串的模式匹配算法(BF算法、KMP算法)
数据结构·算法