如何判断链表有环

如何判断类似这样含有环的链表


第一种:暴力对比
第二种:借助HashSet
第三种:跑步法

暴力对比

暴力对比法是最容易想到的,每次遍历一个节点都和这个节点之前的所有节点进行比对,如果在这个节点之前有和这个节点相同的节点,那么就判定这个链表是有环的。
但是这只是个想法,在java中对象的传递大多都是引用传递,遍历要维护两个变量,还要去把值copy出来,使用代码去写不是很好写。

借助HashSet

把每个节点都放到HashSet里面,如果放不进去则说明有环。
空间复杂度为O(NB),时间复杂度为O(N)

    class Node {
        Object value;
        Node next;
        public Node(Object value) {
            this.value = value;
        }
    }
    boolean hasCycle(Node node) {
        HashSet<Object> temp = new HashSet<>();
        while (node.next != null){
            if(!temp.add(node.value)){
                return true;
            }
            node = node.next;
        }
        return false;
    }

跑步法

维护两个指针,A指针一次跳一个,B指针一次跳两个,如果有环的话那么B指针就会和A指针相遇,如果没有就直接遍历结束。
空间复杂度为O(1),时间复杂度为O(N)

    class Node {
        Object value;
        Node next;
        public Node(Object value) {
            this.value = value;
        }
    }
    boolean hasCycle(Node node) {
        if (node == null || node.next == null) {
            return false;
        }
        Node slow = node;
        Node fast = node.next;
        while (slow != fast) {
            if (fast == null || fast.next == null) {
                return false;
            }
            slow = slow.next;
            fast = fast.next.next;
        }
        return true;
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 漫画算法:如何判断链表有环? - 文章 - 伯乐在线 大四毕业前夕,计算机学院, 正在四处求职的小灰碰到了同系的学...
    viva158阅读 5,353评论 1 2
  • 1 序 2016年6月25日夜,帝都,天下着大雨,拖着行李箱和同学在校门口照了最后一张合照,搬离寝室打车去了提前租...
    RichardJieChen阅读 10,638评论 0 12
  • 转载请注明出处:http://www.jianshu.com/p/c65d9d753c31 在上一篇博客《数据结构...
    Alent阅读 8,840评论 4 74
  • 1. 链表 链表是最基本的数据结构,面试官也常常用链表来考察面试者的基本能力,而且链表相关的操作相对而言比较简单,...
    Mr希灵阅读 5,351评论 0 20
  • 参考链接 基本数据结构:链表(list) 线性表 线性表是最基本、最简单、也是最常用的一种数据结构。线性表中数据元...
    梦即是幻阅读 3,529评论 0 3

友情链接更多精彩内容