2024年最全< 数据结构 > 单向环形链表_单向链表带环,2024年最新普通二本的辛酸C C++面试之路

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

(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&&fast->next)
    {
        slow=slow->next;
        fast=fast->next->next;
        if(slow==fast)
        {
            return true;
        }
    }
    return false;
}

单纯从解体的角度看,此题并不复杂,仅需用到快慢指针的思想即可解决,单是由此题可以引出多个值得我们探讨的问题,以此来加深我们对环形链表的认知,如下三大拓展问题:

4、拓展问题
(1)slow一次走1步,fast一次走2步,一定能追上吗?
  • 答案:一定能。
  • 证明:

当slow走到中间的时候,fast一定进环了,此时fast开始追击。我们假设slow进环以后,slow和fast的距离是N,此时slow走1步,fast走2步,它们俩的距离缩短1变为N-1。以此类推,每次追击,距离缩小1,当距离缩小为0时就追上了。综上,一定能追上。

(2)slow一次走1步,fast一次走3步,能追上吗?fast一次走4步呢?n步呢?
  • 答案:不一定
  • 证明:

我们先来讨论slow一次走1步,fast一次走3步的情况。假设slow走了1步,fast走3步时刚好进环,而当slow刚好进环的时候,fast可能已经走了1圈,具体情况得看环的大小,此时slow和fast之间的距离为N。并假设环的长度是C。

slow一次走1步,fast一次走3步,距离变为N-2。由此可见,fast和slow每走一次,距离缩短2。此时就不难发现了,需要分类讨论,当N是偶数时,刚好可以追上,当N是奇数时,追到最后距离为-1,此时就要再追了,意味着slow和fast之间的距离变成C-1。

继续追击,根据前面的分析,如果C-1是偶数,那么可以追上。如果C-1是奇数,那么就永远追不上了,将会无线循环追下去,可就是追不上。他们的差距N是由进环前的长度和环的长度决定的,而这两个又都是随机的,所以N的值不确定,可奇可偶,又像刚刚那样讨论下去,出现奇数将一去不复返。

同理fast一次走4步也是这样的讨论,同样都是不一定,不过这个时候是每走一次,距离缩短3。当N是3的倍数就可以追上,当不是3的倍数就要继续讨论了,有兴趣的童鞋可以继续钻研下去,思想和fast一次走3步一样,这里不过多赘述。

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

当我们搞清楚slow和fast分别走的距离时,入口点自然就明了了。

  • 法一:

slow一次走1步,fast一次走2步,那么fast走的距离是slow的2倍

在具体讲解之前,首先要搞清楚,不存在说慢指针slow在里头走了一圈,快指针fast还没有追到slow,因为fast每次走2步,slow每次走1步,它俩间的距离每次都缩小1,所以只会越来越近,直到追到。最多最多也就快1圈,但从来也不会刚好满1圈。所以下面很容易推出slow和fast分别走了多少。

  • 假设:
  1. 【链表头 - - - 入口点】:L
  2. 【入口点 - - - 相遇点】:X
  3. 【环的长度】:C

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

深入研究,那么很难做到真正的技术提升。**

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值