zoukankan      html  css  js  c++  java
  • 【剑指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));
        }
    }

    执行结果

    这里写图片描写叙述

  • 相关阅读:
    初识NuGet
    NHibernate之映射文件配置说
    NHibernate 数据查询之QueryOver<T>
    一、NHibernate配置所支持的属性
    javascript forEach无法break,使用every代替
    missing ) after argument list
    数组分组chunk的一种写法
    call和apply第一个参数为null/undefined,函数this指向全局对象
    apply的理解和数组降维
    javascript push 和 concat 的区别
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5326295.html
Copyright © 2011-2022 走看看