首页 > 其他 > 详细

链表中环的入口节点

时间:2020-06-29 10:42:26      阅读:63      评论:0      收藏:0      [点我收藏+]

题目描述

给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
 

题目分析

1.如果存在环:(1)设置两个指针,一个步长为1,一个步长为2。如果链表中存在环,那么快的指针一定会追上慢的指针,

       而且此时慢指针还没有走完一圈。

       (2)此时慢指针到环入口节点的长度与头结点到环入口节点的长度相等。

2.如果不存在环:1中的两个指针不会相等。

 

/*
 public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {

    public ListNode EntryNodeOfLoop(ListNode pHead)
    {
        ListNode slow = pHead;
        ListNode fast = pHead;
     //先要判断slow.next和slow.next.next是否为空。为空说明不存在环返回null。如果这里不判断,对只有一个节点的链表会产生空指异常。
if (pHead == null || pHead.next == null || pHead.next.next == null) { return null; } slow = slow.next; fast = fast.next.next;
//当slow为null或者fast为null或者slow和fast相等时结束循环。
while (slow != null && fast != null && slow != fast) { slow = slow.next; fast = fast.next.next; }
   //如果上面的while循环结束时,slow或者fast为null说明不存在环,返回null。
if (slow == null || fast == null) { return null; }else { ListNode temp = pHead;
       //从开始节点到环入口节点的长度和fast和slow相遇的节点到环的入口节点的距离相等。它们的步长一次加1,相等的时候就是环的入口节点。
while (temp != slow) { slow = slow.next; temp = temp.next; } return temp; } } }

 

链表中环的入口节点

原文:https://www.cnblogs.com/ofmou/p/13206394.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!