金融企业网站建设公司,城乡建设部官方网站,高端网站建设电话,小程序开发软件有哪些文章目录 Linked List Cycle 环形链表问题描述#xff1a;分析代码哈希快慢指针 Tag Linked List Cycle 环形链表
问题描述#xff1a;
给你一个链表的头节点 head #xff0c;判断链表中是否有环。
如果链表中有某个节点#xff0c;可以通过连续跟踪 next 指针再次到达… 文章目录 Linked List Cycle 环形链表问题描述分析代码哈希快慢指针 Tag Linked List Cycle 环形链表
问题描述
给你一个链表的头节点 head 判断链表中是否有环。
如果链表中有某个节点可以通过连续跟踪 next 指针再次到达则链表中存在环。 为了表示给定链表中的环评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置索引从 0 开始。注意pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。
如果链表中存在环 则返回 true 。 否则返回 false 。 链表中节点的数目范围是 [ 0 , 1 0 4 ] − 1 0 5 N o d e . v a l 1 0 5 p o s 为 − 1 或者链表中的一个有效索引 链表中节点的数目范围是 [0, 10^4]\\ -10^5 Node.val 10^5\\ pos 为 -1 或者链表中的一个 有效索引 链表中节点的数目范围是[0,104]−105Node.val105pos为−1或者链表中的一个有效索引
分析 目标就是判断链表中是否有环。 对于无环链表依次遍历节点最后一定是null否则就会进入循环之前已经访问过的节点势必会重新访问。 所以如何知道节点是否被访问过就是需要解决的问题。 错误 有的思路是利用节点的值进行判断很明显这个思路有缺陷如果整个链表都是相同的值就明显无法进行判断。 哈希 而使用哈希表就可以解决这个问题它可以保证哈希表中的元素一定是唯一的不会重复。 这个原理可以自行BingGPT什么的。
所以遍历的过程中每遇到一个新节点就利用哈希表进行判断是否出现过如果出现过说明了节点一定重复访问了从而说明 有环。 时间复杂度 O ( N ) O(N) O(N) ,空间复杂度 O ( N ) O(N) O(N) 这个是比较常规的操作也是大部分的思路。 升级 这个思路很典型但是随着数据规模的增加时空的消耗也会增加。 快慢指针 另一种是双指针一个fast一个slowfast一次走2步slow一次一步。 就像围着操场[环]跑步fast一定会追上slow. 其实这里的双指针也叫快慢指针该思路还可以解决链表的其他问题。
时间复杂度 O ( N ) O(N) O(N)
空间复杂度 O ( 1 ) O(1) O(1)
代码
哈希
public boolean hasCycle(ListNode head) {SetListNode seen new HashSetListNode();while (head ! null) {if (!seen.add(head)) {return true;}head head.next;}return false;} 时间复杂度 O ( N ) O(N) O(N)
空间复杂度 O ( N ) O(N) O(N)
快慢指针
public boolean hasCycle(ListNode head) {if(headnull||head.nextnull) return false;ListNode vh new ListNode(-1);vh.next head;ListNode fast head.next,slow vh;while(fast!nullfast.next!null){if(fastslow) return true;fast fast.next.next;slow slow.next;}return false;}时间复杂度 O ( N ) O(N) O(N)
空间复杂度 O ( 1 ) O(1) O(1)
Tag
LinkedList
Hash
Two Pointers