美文网首页
单向链表-有环链表环节点

单向链表-有环链表环节点

作者: 今年花开正美 | 来源:发表于2020-05-30 22:40 被阅读0次

今天学习的算法是链表有环判断的升级版,若链表有环则需返回环节点。

题目介绍

题目就不再进行介绍了,直接使用之前的图吧:


链表有环-题目.png

实现思路

获取换节点分为两步来实现,先看两步的图吧。
第一步:获取快慢指针相遇节点,直接使用链表有环判断的图吧:


链表有环-解题.png

第二步:获取环节点:


链表有环-环节点.png
难点说明

首先第一步目的是为了快慢指针的相遇节点,至于如何使用快慢指针来找到相遇节点就不再阐述了,可以参考单向链表-链表有环判断

下面重点来分析下第二步,为什么快慢指针相遇后,测量指针为什么和慢指针会在环节点相遇。回到快慢节点相遇时,假设快指针移动的步数为F(每次2步),慢指针移动的步数为S(每次一步),环的长度为b。因此我们可以得到以下两个公式:
1.F=2S;
2.F=S+nb,这个稍微难理解,可以想象下,快指针能和慢指针相遇,那快指针一定是基于相遇节点然后在环里面转了n圈。

根据上面的两个公式我们可以得到:S=nb;
假设从头节点到环节点的长度为a,环节点到相遇节点为x,则S=a+x;

再结合上面两个公式可以得到 a = nb-x。
那么只要让慢指针从相遇节点开始移动,移动nb-x后就会停留在环节点。
同时新增测量指针与慢指针同时开始移动,移动a步后停留在了环节的。
而a=nb-x,因此我们可以证明测量指针和慢指针一定会在环节点相遇。

实现代码

public ListNode detectCycle(ListNode head) {
    if (null == head || null == head.next) {
        return null;
    }

    ListNode slowNode = head;
    ListNode fastNode = head;
    while (null != fastNode && null != fastNode.next) {
        slowNode = slowNode.next;
        fastNode = fastNode.next.next;
        if (null != fastNode && slowNode == fastNode) {
        break;
        }
    }
    if (null == fastNode || null == fastNode.next) {
        return null;
    }

    ListNode surveyNode = head;
    while (surveyNode != slowNode) {
        surveyNode = surveyNode.next;
        slowNode = slowNode.next;
    }
    return surveyNode;
}

相关文章

  • Java实现有环的单向链表,并判断单向链表是否有环

    Java实现有环的单向链表,并判断单向链表是否有环 有一个单向链表,链表当中有可能出现环,就像下图这样。我们如何判...

  • 算法应用-单链表

    单向链表中代码实现检查是否有环,如果有环,求环的长度和入环的节点? 思路: 假设单链表如上图,检查是否有环这个简单...

  • 数据结构-链表

    相关掌握点 单向链表 双向链表 反转单向链表 判断链表是否含有环 链表构建 链表是一种线性结构,是通过指针引用节点...

  • 链表

    单向链表 链表反转 判断是否有环,找链表的中间节点 快慢指针 找环的入口(求两个链表的交点可以转化成这个问题) p...

  • Golang 数据结构练习——单链表找环

    问题:一个单向链表,怎样怎么检测是否有环,环的初始节点是什么?

  • 链表

    现在有一个单向链表,谈一谈,如何判断链表中是否出现了环 考察点:链表参考回答:单链表有环,是指单链表中某个节点的n...

  • 两个无限长度链表(也就是可能有环) 判断有没有交点

    给定单链表,检测是否有环。如果有环,则求出进入环的第一个节点。 判断单向链表是否有环,可以采用快指针与慢指针的方式...

  • 链表面试常见合集

    给定单链表,检测是否有环。如果有环,则求出进入环的第一个节点。 判断单向链表是否有环,可以采用快指针与慢指针的方式...

  • 单向链表-有环链表环节点

    今天学习的算法是链表有环判断的升级版,若链表有环则需返回环节点。 题目介绍 题目就不再进行介绍了,直接使用之前的图...

  • 单向链表的环检测

    Java实现单向链表的环检测 单向链表的环检测,思想是使用一个慢指针和一个快指针,同时从头节点出发,如果有环的话两...

网友评论

      本文标题:单向链表-有环链表环节点

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