摘要:初始化时指针走两步,指针走一步,不停遍历的变化最后快慢指针又相遇了,循环结束,代码实现如下复杂度分析,假设链表长度为时间复杂度,链表无环时,快指针会先到达尾部,时间就是如果有环,那么假设环部长度为,时间就是,也就是空间复杂度
上一篇文章我们分析了下链表之反转单向链表,这篇文章我们来分析下另外一个关于链表的经典题目。
判断链表是否有环(在leetcode上的题目地址:环形链表)
题目描述给定一个链表,判断链表中是否有环
解决方案一、可以使用hash表来实现,遍历链表,每个节点放入hash表中,如果hash表中包含了某个节点,那么说明有重复节点存在,即是有环。如果没环,那么链表会遍历结束。代码如下:
public static> boolean hasCycle1(Node head) { HashSet > set = new HashSet<>(); for(Node n=head;n!=null;n=n.getNext()) { if(set.contains(n)) { return true; } set.add(n); } return false; }
备注Node类参照上篇文章
复杂度分析,假设链表长度为n
时间复杂度:每个元素都要遍历一遍,所以时间为O(n),每次访问hash表时间为O(1)。
空间复杂度:O(n),n个元素都会添加到hash表中。
二、上面这种方法可以解决,但是需要借助额外的空间复杂度,能否不使用额外空间解决此题呢?答案是有的,使用快慢指针,想象下,两个人在一个环形跑道上赛跑,跑得快的一定会追上跑的慢的那个人吧。下面用图示来展示下整个过程。
初始化时:
fast指针走两步,slow指针走一步,不停遍历的变化:
最后快慢指针又相遇了,循环结束,代码实现如下:
public static> boolean hasCycle(Node head) { if(head == null || head.getNext() == null) { return false; } Node slow = head; Node fast = head; while(fast != null && fast.getNext() != null) { slow = slow.getNext(); fast = fast.getNext().getNext(); if(slow == fast) { return true; } } return false; }
复杂度分析,假设链表长度为n
时间复杂度:O(n),链表无环时,快指针会先到达尾部,时间就是O(n);如果有环,那么假设环部长度为K,时间就是O(n+k),也就是O(n)
空间复杂度:O(1)
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/71735.html
摘要:本系列所有文章第一篇文章学习数据结构与算法之栈与队列第二篇文章学习数据结构与算法之链表第三篇文章学习数据结构与算法之集合第四篇文章学习数据结构与算法之字典和散列表第五篇文章学习数据结构与算法之二叉搜索树简单介绍链表链表一种常见的数据结构,可 本系列所有文章:第一篇文章:学习数据结构与算法之栈与队列第二篇文章:学习数据结构与算法之链表第三篇文章:学习数据结构与算法之集合第四篇文章:学习数...
摘要:不同链表是链式的存储结构数组是顺序的存储结构。从列表中,移除并返回特定位置的一项。返回列表中元素个数,与数组的属性类似。提示端优先使用以上的语法实现。不要忘记在最后返回新的头引用复杂度分析时间复杂度。假设是列表的长度,时间复杂度是。 这是第三周的练习题,原本应该先发第二周的,因为周末的时候,我的母亲大人来看望她的宝贝儿子,哈哈,我得带她看看厦门这座美丽的城市呀。 这两天我抓紧整...
摘要:一定要认真看分析注释题目要求题目描述输入一个链表,从尾到头打印链表每个节点的值。分析因为链表只有知道当前结点才能知道下一结点,所以不可能直接从后往前打印。 一定要认真看 分析 | 注释 | 题目要求 Question 1 题目描述:输入一个链表,从尾到头打印链表每个节点的值。 分析:因为链表只有知道当前结点才能知道下一结点,所以不可能直接从后往前打印。这种逆序的算法(策略)我们常用栈这...
阅读 1965·2021-10-25 09:48
阅读 2785·2021-09-22 14:59
阅读 1757·2019-08-29 16:52
阅读 855·2019-08-29 16:07
阅读 2300·2019-08-29 12:38
阅读 1754·2019-08-26 13:23
阅读 877·2019-08-26 11:49
阅读 3267·2019-08-26 10:56