zoukankan      html  css  js  c++  java
  • 判断链表是否环形

    问题描述

    怎么能够更高效地判断一个链表是否有环呀?

    首先创建两个指针p1和p2(在Java里就是两个对象引用),让它们同时指向这个链表的头节点。

    然后开始一个大循环,在循环体中,让指针p1每次向后移动1个节点,让指针p2每次向后移动2个节点,然后比较两个指针指向的节点是否相同。如果相同,则可以判断出链表有环,如果不同,则继续下一次循环

    示意图

    学过小学奥数的读者,一定听说过数学上的追及问题。

    此方法就类似于一个追及问题。在一个环形跑道上,两个运动员从同一地点起跑,一个运动员速度快,另一个运动员速度慢。当两人跑了一段时间后,速度快的运动员必然会再次追上并超过速度慢的运动员,原因很简单,因为跑道是环形的。

    假设链表的节点数量为n,则该算法的时间复杂度为O(n)。

    除两个指针外,没有使用任何额外的存储空间,所以空间复杂度是O(1)

    示例代码

    public class LinkedListCycle {
    
        /**
         * 判断是否有环
         * @param head  链表头节点
         */
        public static boolean isCycle(Node head) {
            Node p1 = head;
            Node p2 = head;
            while (p2!=null && p2.next!=null){
                p1 = p1.next;
                p2 = p2.next.next;
                if(p1 == p2){
                    return true;
                }
            }
            return false;
        }
    
        /**
         * 链表节点
         */
        private static class Node {
            int data;
            Node next;
            Node(int data) {
                this.data = data;
            }
        }
    
        public static void main(String[] args) throws Exception {
            Node node1 = new Node(5);
            Node node2 = new Node(3);
            Node node3 = new Node(7);
            Node node4 = new Node(2);
            Node node5 = new Node(6);
            node1.next = node2;
            node2.next = node3;
            node3.next = node4;
            node4.next = node5;
            node5.next = node2;
    
            System.out.println(isCycle(node1));
        }
    }
    

    扩展

    如果链表有环,如何求出环的长?

    当两个指针首次相遇,证明链表有环的时候,让两个指针从相遇点继续循环前进,并统计前进的循环次数,直到两个指针第2次相遇。此时,统计出来的前进次数就是环长。

    因为指针p1每次走1步,指针p2每次走2步,两者的速度差是1步。当两个指针再次相遇时,p2比p1多走了整整1圈因此,环长 = 每一次速度差 × 前进次数 = 前进次

  • 相关阅读:
    爬虫问题总结
    keras快速开始序贯(Sequential)模型
    参数估计回顾
    CSDN-markdown编辑器 字体颜色修改
    贝叶斯决策学习
    概率论中的基本公式
    VMware tools安装
    Python 常用技巧:库/模块的安装、查看和卸载
    Google 机器学习笔记一 Pandas简介
    支持向量机 数学推导 part3
  • 原文地址:https://www.cnblogs.com/zhaoqingqing/p/11853924.html
Copyright © 2011-2022 走看看