zoukankan      html  css  js  c++  java
  • 算法练习(7)-判断单链表是否有环,以及求环的长度

    如上图,一个单链表,如何判断有没有环? 如果有,如何求环的长度?

    如果面试时,遇到这个题目,先喝口水压压惊,回想一下,咱们小时候念小学时,数学老师最喜欢的一类题目:

    跑道上,2个运动员,1个速度是3m/s,1个速度是5m/s,同一起点起跑后,多久运动员2会再次遇到运动员1?是不是感觉异曲同工? 这2个速度不同的运动员,相当于就是快/慢2个指针

    @Data
    class Node {
        private String value;
        private Node next;
    
        public Node(String value) {
            this.value = value;
        }
    }
    
    @Test
    public void isLoopLink() {
        Node a = new Node("a");
        Node b = new Node("b");
        Node c = new Node("c");
        Node d = new Node("d");
        a.next = b;
        b.next = c;
        c.next = d;
        d.next = b;
    
        int loopSize = 0, meetCount = 0;
        Node slow = a, fast = a;
        while (slow.next != null) {
            fast = fast.next.next;
            slow = slow.next;
            if (fast == null || slow == null) {
                System.out.println("it is not a loop link");
                break;
            }
            if (fast.value.equalsIgnoreCase(slow.value)) {
                //首次相遇
                meetCount += 1;
                if (meetCount > 1) {
                    //再次相遇
                    System.out.println("it is a loop link,loopSize:" + loopSize);
                    break;
                }
            }
            if (meetCount == 1) {
                //首次遇到后,开始数环的节点个数
                loopSize += 1;
            }
        }
    }
    
    作者:菩提树下的杨过
    出处:http://yjmyzz.cnblogs.com
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    CTFHub_技能树_文件上传
    QT入门-重载的信号槽
    QT入门-自定义信号
    C++: xx does not name a type报错
    HDU1166 敌兵布阵
    洛谷P2574 XOR的艺术(线段树)
    P3373 【模板】线段树 2(板子好题)
    SP1716 GSS3
    QT入门-自定义槽函数
    Educational Codeforces Round 87 (Rated for Div. 2) D. Multiset(树状数组/好题)
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/14586223.html
Copyright © 2011-2022 走看看