• 经典OJ题:找环节点——代码解析


    题目:

    • 给定一个链表的头节点  head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null
    • 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
    • 不允许修改 链表。
    • 返回链表开始入环的第一个节点:就是进入环型后的第一个节点,如下图示例1中的 数据为2的节点,而数据为2的这个节点也称为环形链表的入口节点。

    题目来源:142. 环形链表 II - 力扣(LeetCode) 

    示例:

    思路:

    根据找环的思路,我们可以划分为两种,寻找节点中的数据是否一样来进行判断是否是环形,以及寻找节点的地址是否一样来进行判断是否是环形。

    对于第一种:寻找节点中的数据是否一样来判断是否是环形,无非是判断节点内部的数据是否一致,但是这种判断方法过于的愚蠢,因为节点的数据是可以重复的,而且节点内的数据是不重复的!我们又改如何进行判断操作,是否要将节点中的数据进行存储,然后每次移动指针进行判断时一一进行对比?

    非常的繁琐和傻逼!但又会有部分人会先入为主到这种方法!(包括作者自己)

    而第二种,寻找节点空间是否一致,我们可以设置两个指针分别进行移动和判断,当两个指针判断成功后我们就可以返回环形节点。

    方法解析:

    对于两个指针,我们可以参考之前的快慢指针方法。

    单链表经典OJ题:找出链表的中间节点-CSDN博客

    设置一个快指针 fast 快指针走两步,慢指针走一步,当快指针和慢指针指向的节点一样时,slow指针会在环形内部和fast指针相遇,也就说当fast指针指向的节点空间地址等于slow指向的节点空间地址时,环形存在,又或者说,当环形不存在时,fast和slow的最终指向是NULL

    但是,当slow和fast指向的空间地址一样时,就表示这个指针指向的节点是入环后的第一个节点?

    如下图所示,fast进入环形链表后并没有第一时间遇见slow,返回值也并不是我们需要的,且如果再以 fast走两步和slow走两步的规律走下去,二者能抵达到我们所需要的节点非常困难,所以我们要另辟蹊径进行改造。

    首先,我们要知道,如果fast走两步slow走一步,不论如何,fast都会比slow快一圈,而slow会比fast慢几步,因此我们可以得出结论,fast总是能和slow走到相同的节点位置,也就是二者总会相等的。

    • 且,另一个点,当fast和slow相遇时,一定是再环内的,入上图所示,不仅如此,当slow入环后,再环形链表中,就变成了fast追逐slow,所以我们要将二者的前进步数减慢。
    • 同时,我们要把二者同时变成不同的位置拉开距离再次进行相互的追逐,直到二者相同时,便就是我们需要寻找的节点。

    数学解释题目:

    最终的理解便是: 设fast从相遇点开始移动而slow再与fast相遇后,立马返回单链表头节点位置,并且从头移动,当二者同步、同时移动 L 距离,二者相遇,而相遇的点就是环形节点的入口。

    代码演示:

  • 相关阅读:
    [ruby on rails] pg触发器trigger的使用
    《Docker极简教程》--Docker服务管理和监控--Docker服务的管理
    RabbitMQ(十)【高级 - 集群】
    跟着播客学英语-Why I use vim ? part two
    20天拿下华为OD笔试之【模拟】2023B-查字典【欧弟算法】全网注释最详细分类最全的华为OD真题题解
    docker 容器原理分析笔记(上)
    【用文心一言学习】MongoDB查询问题
    FFmpeg解复用器(解封装)简单测试【2】
    无代码开发单条数据分享入门教程
    web前端期末大作业——基于html+css+javascript学生宿舍管理系统网站
  • 原文地址:https://blog.csdn.net/2301_76445610/article/details/134256608