剑指offer-- 链表中环的入口结点(Java)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_40244153/article/details/88081162

题目:一个链表中包含环,如何找出环的入口结点?例如,在图3.8的链表中,环的入口结点是结点3。
思路:
  1.确定链表是否有环:通过两个不同速度的指针确定,当两个指针指向同一个结点时,该结点为环中的一个结点。
  2.确定环中结点的数目n:指针走一圈,边走边计数
  3.找到环的入口:从头结点开始,通过两个相差为n的指针来得到(即寻找链表中倒数第n+1个结点)

考点:代码的鲁棒性

实现:

    public ListNode EntryNodeOfLoop(ListNode pHead)
    {
        if(isCircle(pHead) == null) return null;
        int n=1;
        ListNode end = isCircle(pHead);
        ListNode begin = end.next;
        while(end!=begin){
            begin = begin.next;
            n++;
        }
        ListNode slow = pHead;
        ListNode fast = pHead;
        while(n-->0){
            fast=fast.next;
        }
        while(fast!=slow){
            slow = slow.next;
            fast = fast.next;
        }
        return fast;
    }
    public ListNode isCircle(ListNode head){
        if(head == null ||head.next == null) return null;
        ListNode slow= head.next;
        ListNode fast= head.next.next;
        while(slow!=fast){
            if(fast.next.next!=null){
                slow=slow.next;
                fast=fast.next.next;
            }else{
                return null;
            }
        }
        return slow;
    }

收获:

  1. 通过两个不同速度的指针可以确定链表中是否有环
  2. 相差n步的两个指针可以找到倒数第n+1个结点(类似于链表中倒数第k个结点)
  3. 复杂问题分解成为几个简单问题(本题分为三步:找出环中任一结点;得到环的个数;找到入口结点)

猜你喜欢

转载自blog.csdn.net/weixin_40244153/article/details/88081162