嗨!~ 大家好,我是YK菌 🐷 ,一个微系前端 ✨,喜欢分享自己学到的小知识 🏹,欢迎关注我呀 😘 ~ [微信号:
yk2012yk2012,微信公众号:ykyk2012]
「这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战」
141. 环形链表
给定一个链表,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪
next指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数pos来表示链表尾连接到链表中的位置(索引从0开始)。 如果pos是-1,则在该链表中没有环。注意:pos不作为参数进行传递,仅仅是为了标识链表的实际情况。
如果链表中存在环,则返回
true。 否则,返回false。
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/li…
【解法一】使用Map
看到再次到达四个字的时候,我们想到的就是需要把之前遍历过的结点都记住,这样再次访问到的时候就知道了。很自然的就想到了Map这样的数据结构。
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {boolean}
*/
var hasCycle = function(head) {
let map = new Map()
// 遍历链表
while(head) {
// 如果map中有这个结点,说明指针再次到达,返回true,表示有环
if(map.has(head)) return true
// 将结点放入map中,值存为true,方便做判断
map.set(head, true)
// 指针后移
head = head.next
}
// 循环结束都没有返回true说明没有环,返回false
return false
};
用了一个map,空间复杂度有点高
【解法二】快慢指针
我们换一个思路,我们用两个指针来遍历链表。 一个指针每次只走一步,我们称之为慢指针,一个指针每次走两步,我们称之为快指针。
遍历链表,如果快慢指针相遇就说明有环存在,如果没有相遇过就说明没有环
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {boolean}
*/
var hasCycle = function(head) {
let fast = head
let slow = head
while(fast){
if(fast.next === null) return false
slow = slow.next
fast = fast.next.next
if(slow === fast) return true
}
return false
};
【解法三】JS特性
最后,我们巧用JS特性来解决这道题
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} head
* @return {boolean}
*/
var hasCycle = function(head) {
try{
JSON.stringify(head)
}catch(e){
return true
}
return false
};
阿这
最后,欢迎关注我的专栏,和YK菌做好朋友~