美文网首页
链表 - 检测环 & 环入口点

链表 - 检测环 & 环入口点

作者: 小院里栽棵树 | 来源:发表于2021-12-02 16:48 被阅读0次

对于链表检测是否有环,大家都知道 使用快慢指针就可以了。只要快慢指针可以相遇,那么链表一定是有环的。

一般我们都是对如何找到环入口点,以及为什么这个点就是入口点有疑惑。我们一步步来,我先告诉你如何找入口点,再告诉你为什么这个点就是入口点。

快指针:一步走2个结点
慢指针:一步走1个结点

如何找入口?
当快慢指针相遇时,我们把快指针移动到链表的头结点,然后把步伐设置为一步走1个结点。那么当快慢指针再次相遇时的结点,就是环的入口点。

为什么这个点是入口?
快慢指针第一次相遇时,快指针走了2N的结点,慢指针走了N个结点。
我们想一下,如果慢指针再走N步,是不是还是会回到当前和快指针相遇的这个点?那必然啊,再走N步,那么慢指针一共走了N+N = 2N个结点,和快指针走的结点一样了,那必然还是在相遇的这个点的位置。
那相遇到时候,我们把快指针移回到链表的头结点,步伐设置为一步一个节点,再走N步,是不是也会走到刚才快慢指针相遇的那个结点?这是废话,这不就把刚才的慢指针走过的节点又走了一遍,也必然是走到了刚才快慢相遇的节点了。

所以当第一次快慢指针相遇的时候,我们让慢指针接着走,快指针移回到头结点,并且步伐设置为1,在走N步,这时候快慢指针又会再次在同一个节点相遇。又因为快指针走了N个结点,慢指针也是N个结点,步伐此时都为1,那么它们2个相遇的节点,就一定是环的入口点了,毕竟步伐一样为1。

代码:

    private static ListNode findNode(ListNode node) {

        if (node == null || node.next == null) return null;
        
        ListNode quickNode = node;
        ListNode slowNode = node;

        //先判断是否有环,如果有环,找到相遇的结点
        do {
            quickNode = quickNode.next.next;
            slowNode = slowNode.next;
        } while (quickNode != null && quickNode.next != null && quickNode != slowNode);

        if (quickNode == null || quickNode.next == null) return null;

        quickNode = node;

        //找到环的入口
        while (quickNode != slowNode) {
            quickNode = quickNode.next;
            slowNode = slowNode.next;
        }

        return quickNode;
    }

相关文章

  • 链表 - 检测环 & 环入口点

    对于链表检测是否有环,大家都知道 使用快慢指针就可以了。只要快慢指针可以相遇,那么链表一定是有环的。 一般我们都是...

  • 环检测算法(Floyd's Tortoise and H

    Cycle Detect 环检测算法常用检测链表是否有环,如果有环,给出环的长度和环的入口点。相关题目: 287....

  • 单链表是否存在环

    面试题:如何检测一个单链表是否有环?如果有环的入口在哪里? 题目描述: 单链表有环指的是单链表中某个结点的next...

  • P111-判断一个单向链表是否构成了环形,找出环的出口

    判断是否为环 思路1 两个指针 思路2 map 求入口 参考:链表有环,判断环的入口点 求环长 参考:那么如何得到...

  • 编程案例自我总结(二)

    16.链表环的入口:如果一个连表中包含环,求出环的入口节点(回归链表的地方)。 思路:1.确认环是否存在 ...

  • 链表寻找环的入口

    给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 分析:如何判断有环?如何找到环的入口节...

  • 链表 环

    1 链表是否有环先使用快慢指针确定是否有环2 链表环交点L代表环之前的长度x代表环入口点与相遇处的长度R代表环的长...

  • 算法题面试复习

    算法模块 1. 链表 1. 链表翻转 2. 单链表判断是不是环+求环位置+求环长度 以图片为例,假设环入口距离链表...

  • 面试题23(剑指offer)--链表中环的入口节点

    题目: 给一个链表,若其中包含环,请找出该链表的环的入口结点。 思路: �链表中环的入口节点 先确定有环,用快慢指...

  • 检测链表有环

    题目:如何判断一个单链表是否有环?若有环,如何找出环的入口节点。 一、单链表是否有环 思路分析: 单链表有环,是指...

网友评论

      本文标题:链表 - 检测环 & 环入口点

      本文链接:https://www.haomeiwen.com/subject/jpsyxrtx.html