LeetCode:141. 环形链表 | JavaScript解题

简介: LeetCode:141. 环形链表 | JavaScript解题

141. 环形链表

难度简单1618

给你一个链表的头节点 head ,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。

如果链表中存在环 ,则返回 true 。 否则,返回 false

 

示例 1:

微信截图_20221112164644.png


输入: head = [3,2,0,-4], pos = 1
输出: true
解释: 链表中有一个环,其尾部连接到第二个节点。
复制代码


示例 2:

微信截图_20221112164652.png

输入: head = [1,2], pos = 0
输出: true
解释: 链表中有一个环,其尾部连接到第一个节点。
复制代码


示例 3:

微信截图_20221112164702.png

输入: head = [1], pos = -1
输出: false
解释: 链表中没有环。
复制代码

 

提示:

  • 链表中节点的数目范围是 [0, 104]
  • -105 <= Node.val <= 105
  • pos-1 或者链表中的一个 有效索引

 

进阶: 你能用 O(1)(即,常量)内存解决此问题吗?


思路

方法1 插旗法

经过一个节点就做一个记号,当有环,肯定会再次经过。

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @return {boolean}
 */
var hasCycle = function(head) {
    while(head) {
        if(head.flag) {
            return true;
        }else {
            head.flag = true;
            head = head.next;
        }
    }
    return false;
};
复制代码


方法2 快慢指针

有环,快指针肯定会超慢指针一圈然后相遇。

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @return {boolean}
 */
var hasCycle = function(head) {
    if(head == null || head.next == null) return false;
    // 快慢指针不能初始化为一样,不然条件判断他们一样时就出错了
    let slow = head.next; 
    let fast = head.next.next;
    while(slow && fast && fast.next) {
        fast = fast.next.next;
        slow = slow.next;
        if(slow == fast) return true;
    }
    return false;
};



目录
相关文章
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
208 1
Leetcode第21题(合并两个有序链表)
这篇文章介绍了如何使用非递归和递归方法解决LeetCode第21题,即合并两个有序链表的问题。
246 0
Leetcode第21题(合并两个有序链表)
|
11月前
|
算法 Go
【LeetCode 热题100】23:合并 K 个升序链表(详细解析)(Go语言版)
本文详细解析了 LeetCode 热题 23——合并 K 个升序链表的两种解法:优先队列(最小堆)和分治合并。题目要求将多个已排序链表合并为一个升序链表。最小堆方法通过维护节点优先级快速选择最小值,;分治合并则采用归并思想两两合并链表。文章提供了 Go 语言实现代码,并对比分析两种方法的适用场景,帮助读者深入理解链表操作与算法设计。
413 10
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
190 0
LeetCode第二十四题(两两交换链表中的节点)
Leetcode第十九题(删除链表的倒数第N个节点)
LeetCode第19题要求删除链表的倒数第N个节点,可以通过快慢指针法在一次遍历中实现。
254 0
Leetcode第十九题(删除链表的倒数第N个节点)
|
索引
力扣(LeetCode)数据结构练习题(3)------链表
力扣(LeetCode)数据结构练习题(3)------链表
321 0
【LeetCode 10】142. 环形链表 II
【LeetCode 10】142. 环形链表 II
142 0
|
机器学习/深度学习 算法 JavaScript
LeetCode 01——两数之和(使用JavaScript语言)|刷题打卡
LeetCode 01——两数之和(使用JavaScript语言)|刷题打卡
247 0
LeetCode 01——两数之和(使用JavaScript语言)|刷题打卡
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
380 2
|
JavaScript 前端开发
JavaScript中的原型 保姆级文章一文搞懂
本文详细解析了JavaScript中的原型概念,从构造函数、原型对象、`__proto__`属性、`constructor`属性到原型链,层层递进地解释了JavaScript如何通过原型实现继承机制。适合初学者深入理解JS面向对象编程的核心原理。
297 1
JavaScript中的原型 保姆级文章一文搞懂