力扣面试150(46/150)
8.1 141. 环形链表
给你一个链表的头节点 head
,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next
指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos
来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。
如果链表中存在环 ,则返回 true
。 否则,返回 false
。
关于js中的链表:
不同于new Array()
、new Set()
、new Map()
等数据结构,目前js
官方还没有为我们提供一个直接的链表API
实现。不过我们可以通过对象的方式去模拟出一个链表
链表里面有两个重要的数据:data和next
/ 链表对象化,便于理解
const obj = {data: 1,next: {data: 2,next: {data: 3,next: null,},},
};
next指向的是下一个数据
我的思路:
快慢指针:slow,fast
如果是环的话,fast走两步,slow走一步,总有一天会相遇的
我的代码:
var hasCycle = function(head) {let slow = fast = head;while(fast && fast.next){slow = slow.next;fast = fast.next.next;if(slow === fast){return true;}}return false;
};
总结:这段代码通过快慢指针法检测链表是否有环。初始化两个指针都指向头节点,慢指针每次走一步,快指针每次走两步。如果链表存在环,快指针最终会追上慢指针并相遇;如果快指针到达链表末尾,则说明无环。这种方法高效且空间复杂度为O(1)。