< 数据结构 > 单向环形链表

本文深入探讨了环形链表的特性及应用,利用快慢指针原理解决了环形链表的检测问题,并进一步分析了如何定位环的入口点。

目录

1、例题引入

2、何为带环链表

3、题解思路

4、拓展问题

   (1)slow一次走1步,fast一次走2步,一定能追上吗?

   (2)slow一次走1步,fast一次走3步,能追上吗?fast一次走4步呢?n步呢?

   (3)链表环的入口点在哪呢?


1、例题引入

  •  链接直达:

环形链表

  • 题目:

2、何为带环链表

 正常的单链表每个节点顺次链接,最后一个节点指向NULL,如下:

 而带环链表的最后一个节点不再指向NULL了,指向的是前面任意一个节点,以此形成带环链表,并一直循环下去。如下:

3、题解思路

我们可以将上述图画的抽象一点,在没有进入环之前我们用直线表示,进入环之后用圈来表示,以此示意循环。此题需要用到我们之前讲解的求中间节点和求倒数第k个节点的快慢指针的思想。定义两个指针slow和fast均指向一开始的位置。 让slow一次走一步,fast一次走两步。

当slow走到直线一半的位置时,此时的fast刚好就在环的入口点。

 假设slow刚好走到环的入口点时,fast走到如下位置,此时fast开始追赶模式

 fast开始追赶slow,假设fast在如下的位置开始追上slow

  • 代码如下:
bool hasCycle(struct ListNode *head) {
    struct ListNode*slow=head;
    struct ListNode*fast=head;
    while(fast&&
评论 102
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三分苦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值