• 【剑指Offer学习】【面试题56:链表中环的入口结点】


    题目:一个链表中包括环。怎样找出环的入口结点?


    解题思路

      能够用两个指针来解决问题。先定义两个指针P1和P2指向链表的头结点。假设链表中环有n个结点,指针P1在链表上向前移动n步,然后两个指针以同样的速度向前移动。

    当第二个指针指向环的入口结点时,第一个指针已经环绕着环走了一圈又回到了入口结点。
      剩下的问题就是怎样得到环中结点的数目。我们在面试题15的第二个相关题目时用到了一快一慢的两个指针。

    假设两个指针相遇,表明链表中存在环。两个指针相遇的结点一定是在环中。

    能够从这个结点出发。一边继续向前移动一边计数,当再次回到这个结点时就能够得到环中结点数了。

    结点定义

        private static class ListNode {
            private int val;
            private ListNode next;
    
            public ListNode() {
            }
    
            public ListNode(int val) {
                this.val = val;
            }
    
            @Override
            public String toString() {
                return val +"";
            }
        }

    代码实现

    public class Test56 {
        private static class ListNode {
            private int val;
            private ListNode next;
    
            public ListNode() {
            }
    
            public ListNode(int val) {
                this.val = val;
            }
    
            @Override
            public String toString() {
                return val +"";
            }
        }
    
        public static ListNode meetingNode(ListNode head) {
    
            ListNode fast = head;
            ListNode slow = head;
    
            while (fast != null && fast.next != null) {
                fast = fast.next.next;
                slow = slow.next;
                if (fast == slow) {
                    break;
                }
            }
    
            // 链表中没有环
            if (fast == null || fast.next == null) {
                return null;
            }
    
            // fast又一次指向第一个结点
            fast = head;
    
            while (fast != slow) {
                fast = fast.next;
                slow = slow.next;
            }
    
            return fast;
        }
    
        public static void main(String[] args) {
            test01();
            test02();
            test03();
        }
    
        // 1->2->3->4->5->6
        private static void test01() {
            ListNode n1 = new ListNode(1);
            ListNode n2 = new ListNode(2);
            ListNode n3 = new ListNode(3);
            ListNode n4 = new ListNode(4);
            ListNode n5 = new ListNode(5);
            ListNode n6 = new ListNode(6);
    
            n1.next = n2;
            n2.next = n3;
            n3.next = n4;
            n4.next = n5;
            n5.next = n6;
    
            System.out.println(meetingNode(n1));
        }
    
        // 1->2->3->4->5->6
        //       ^        |
        //       |        |
        //       +--------+
        private static void test02() {
            ListNode n1 = new ListNode(1);
            ListNode n2 = new ListNode(2);
            ListNode n3 = new ListNode(3);
            ListNode n4 = new ListNode(4);
            ListNode n5 = new ListNode(5);
            ListNode n6 = new ListNode(6);
    
            n1.next = n2;
            n2.next = n3;
            n3.next = n4;
            n4.next = n5;
            n5.next = n6;
            n6.next = n3;
    
            System.out.println(meetingNode(n1));
        }
    
        // 1->2->3->4->5->6 <-+
        //                |   |
        //                +---+
        private static void test03() {
            ListNode n1 = new ListNode(1);
            ListNode n2 = new ListNode(2);
            ListNode n3 = new ListNode(3);
            ListNode n4 = new ListNode(4);
            ListNode n5 = new ListNode(5);
            ListNode n6 = new ListNode(6);
    
            n1.next = n2;
            n2.next = n3;
            n3.next = n4;
            n4.next = n5;
            n5.next = n6;
            n6.next = n6;
    
            System.out.println(meetingNode(n1));
        }
    }

    执行结果

    这里写图片描写叙述

  • 相关阅读:
    商贸通帐套隐藏方法
    固定资产打开提示:上年度数据未结转!
    ZOJ 2432 Greatest Common Increasing Subsequence
    POJ 1080 Human Gene Functions
    POJ 1088 滑雪
    POJ 1141 Brackets Sequence
    POJ 1050 To the Max
    HDOJ 1029 Ignatius and the Princess IV
    POJ 2247 Humble Numbers
    HDOJ 1181 变形课
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5326295.html
Copyright © 2020-2023  润新知