zoukankan      html  css  js  c++  java
  • 链表中的环入口节点

    public class 链表中的环入口节点
    {
        // pHead为第一个节点
        private ListNode entryNodeOfCycle(ListNode pHead)
        {
            ListNode meetNode = meetNode(pHead);
            // 如果没有环
            if (meetNode == null)
            {
                return null;
            }
            // 计算环的长度
            int lengthOfCycle = 1;
            ListNode curNode = meetNode;
            while (curNode.next != meetNode)
            {
                lengthOfCycle++;
                curNode = curNode.next;
            }
            /*
             * 找出入口节点 利用快慢指针,前者先行lengthOfCycle个节点,然后两者同时前进当fast==low时返回即为入口节点
             *
             */
            ListNode fast = pHead, low = pHead;
            for (int i = 0; i < lengthOfCycle; i++)
            {
                fast = fast.next;
            }
            while (fast != low)
            {
                fast = fast.next;
                low = low.next;
            }
            return fast;
        }

        /*
         * 第一步利用快慢指针找到它们相遇的节点 第二步计算出环内节点个数 第三步找到入口
         */
        private ListNode meetNode(ListNode pHead)
        {
            // 特殊值考虑
            if (pHead == null || pHead.next == null)
            {
                return null;
            }
            ListNode fast = pHead;
            ListNode low = pHead;
            while (fast.next != null && fast.next.next != null)
            {
                fast = fast.next.next;
                low = low.next;
                if (fast == low)
                {
                    return fast;
                }
            }
            return null;
        }
    }

  • 相关阅读:
    python基础之包、模块、命名空间和作用域
    python基础之函数式编程
    python基础之文件操作
    python基础之psutil模块和发邮件(smtplib和yagmail)
    【面试题21】包含min函数的栈
    【面试题20】顺时针打印矩阵
    【面试题19】二叉树的镜像
    【面试题18】树的子结构
    【面试题17】合并两个排序的链表
    【面试题16】反转链表
  • 原文地址:https://www.cnblogs.com/qingtianBKY/p/8193951.html
Copyright © 2011-2022 走看看