力扣-环形链表 easy 🦐

简介: 力扣-环形链表 easy 🦐

前言

数据结构与算法属于开发人员的内功,不管前端技术怎么变,框架怎么更新,版本怎么迭代,它终究是不变的内容。 始终记得在参加字节青训营的时候,月影老师说过的一句话,不要问前端学不学算法。计算机学科的每一位都有必要了解算法,有写出高质量代码的潜意识

一、问题描述

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

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

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

示例 1:

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

示例 2:

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

示例 3:

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

提示:

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

二、思路详解

这里主要介绍两种解法

第一种解法

  • 使用tag来标记迭代过的节点,如果发现有标记的节点那么直接返回true
var hasCycle = function(head) {
    while(head){
        if(head.tag) return true
        head.tag = true
        head = head.next
    }
    return false
};

第二种解法

  • 使用快慢指针,如果存在环的话,快指针每次走两步,满指针每次走一步,如果存在环的话,两个指针一定会相遇的。
var hasCycle = function(head) {
    let slow = head, fast = head
    while(slow && (fast && fast.next)){
        slow = slow.next
        fast = fast.next.next
        if(slow==fast) return true
    }
    return false
};

后续

好了,本篇 力扣-环形链表到这里就结束了,我是邵小白,一个在前端领域摸爬滚打的大三学生,欢迎👍评论。


相关文章
|
6天前
题目----力扣--回文链表
题目----力扣--回文链表
12 0
|
6天前
题目----力扣--合并两个有序链表
题目----力扣--合并两个有序链表
10 0
|
6天前
题目----力扣--反转链表
题目----力扣--反转链表
14 0
|
6天前
题目----力扣--链表的中间结点
题目----力扣--链表的中间结点
6 0
|
6天前
题目----力扣--移除链表元素
题目----力扣--移除链表元素
12 1
|
7天前
|
索引
【力扣刷题】两数求和、移动零、相交链表、反转链表
【力扣刷题】两数求和、移动零、相交链表、反转链表
16 2
【力扣刷题】两数求和、移动零、相交链表、反转链表
|
7天前
|
算法
"刷题记录:哈希表+双指针 | leetcode-2465. 不同的平均值数目 "
该文段是一篇关于编程题目的解答,主要讨论如何找到数组中所有不同平均值的个数。作者首先使用排序和哈希集来解决,将数组转为列表排序后,通过双指针计算平均值并存入哈希集以去重。然后,作者发现可以优化方案,通过双指针在排序后的数组中直接计算两数之和,用哈希集记录不重复的和,从而避免实际计算平均值,提高了算法效率。最终代码展示了这两种方法。
15 0
|
7天前
|
索引
【力扣刷题】删除链表的倒数第 N 个结点、两两交换链表中的节点、随机链表的复制
【力扣刷题】删除链表的倒数第 N 个结点、两两交换链表中的节点、随机链表的复制
14 0
|
7天前
|
存储 算法 索引
【力扣刷题】只出现一次的数字、多数元素、环形链表 II、两数相加
【力扣刷题】只出现一次的数字、多数元素、环形链表 II、两数相加
19 1
|
7天前
【力扣刷题】二叉树的中序遍历、二叉树的最大深度、翻转二叉树、对称二叉树
【力扣刷题】二叉树的中序遍历、二叉树的最大深度、翻转二叉树、对称二叉树
15 0