图解LeetCode——141. 环形链表

news2024/10/5 16:32:51

一、题目

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

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

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

二、示例

2.1> 示例 1:

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

2.2> 示例 2:

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

2.3> 示例 3:

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

提示:

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

进阶:

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

三、解题思路

3.1> 思路1:采用Set保存已遍历过的元素

根据题目描述,我们需要判断某一个链表是否是环形链表,那么环形链表的判断标准就是:在遍历链表的过程中,再次遇到了相同的节点。那么,最容易想到的解题方式就是,我们创建一个Set集合,然后从head头开始遍历链表,在遍历及对比过程中我们需要进行如下判断逻辑:

逻辑1】当发现Set集合中没有当前遍历到的节点时,就将该节点ListNode放入到Set集合中
逻辑2】当我们遍历到某个元素的时候,发现该元素已经在Set集合中存在了,那么就说明这个链表是环形链表
逻辑3】当我们遍历链表时,发现某个节点的next指针等于null时,则表示该链表已经遍历完毕了。那么必然就不是环形链表了

以上就是解题思路,在下图中,我们以一个环形链表的例子,看一下具体的判断流程。请见下图所示:

3.2> 思路2:快慢指针

在思路1中,我们以创建了额外的Set集合去存储遍历节点的路径,那么,我们能用 O(1)(即,常量)内存解决此问题吗?这里面我们可以采用快慢指针的方式进行判断。即:

慢指针】每次移动1步;
快指针】每次移动2步;

在环形链表中,由于快指针比慢指针移动速度更快,所以肯定会在后面进行交汇,即:当slow指针指向的节点等于fast指针指向的节点时,就表示交汇了。那么我们直接返回true即可。

当然,这里面需要注意一点,由于fast的移动是通过调用节点的两次next变量,所以要注意非空的判断。以防调用了null.next造成异常抛出。

四、代码实现

4.1> 实现1:采用Set保存已遍历过的元素

public class Solution {
    public boolean hasCycle(ListNode head) {
        Set<ListNode> set = new HashSet();
        while (head != null) {
            if (!set.contains(head)) set.add(head);
            else return true;
            head = head.next;
        }
        return false;
    }
}

4.2> 实现2:快慢指针

public class Solution {
    public boolean hasCycle(ListNode head) {
        ListNode slow = head, fast = (head == null) ? null : head.next;
        while (fast != null) {
            if (slow == fast) return true;
            slow = slow.next;
            fast = (fast.next == null) ? null : fast.next.next;
        }
        return false;
    }
}

今天的文章内容就这些了:

写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享 。

更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/540111.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用jsDelivr和GitHub,上传本地静态资源到免费CDN

目标&#xff1a;将本地图片资源上传到免费CDN&#xff0c;以便随时使用&#xff01;其他静态资源亦可&#xff0c;例如&#xff1a;js、css、pdf、word、excel 等等 ①在github上创建新仓库&#xff1a;resources&#xff0c;用于存放要上传到 CDN 的静态资源&#xff1a; ②上…

成都欢蓬信息:抖音电商去年GMV增速超80%

在今年的抖音电商生态大会上&#xff0c;抖音电商交出了年度“成绩单”。 5月16日&#xff0c;抖音电商总裁魏雯雯披露&#xff0c;近一年抖音电商GMV&#xff08;成交额&#xff09;增幅超80%。其中&#xff0c;商城GMV同比增长277%&#xff0c;电商搜索GMV同比增长159%&#…

NAVICAT 自动备份数据库到本地

1:设置备份文件存储路径地址 右键数据库连接 ——》编辑连接——》高级 2:选择要备份的数据库 点击 备份——》新建备份——》对象选择 ——》保存 输入文件名称 ——》确定 备份 下出现 保存的备份文件 3:设置自动备份 点击 自动运行——》新建批处理作业 点击 新建…

家电回收APP小程序开发 上门回收旧物管理专家

家用电器使我们日常生活中必不可少的用品&#xff0c;随着使用年限的增加&#xff0c;可能会出现老化问题&#xff0c;人们买了新的之后&#xff0c;废旧电器的处理也成为一大难题。笨重不易移动&#xff0c;扔了可惜&#xff0c;放置占地&#xff0c;该怎么办呢&#xff1f;废…

【Linux下】 线程同步 生产者与消费者模型

文章目录 【Linux下】 线程同步 生产者与消费者模型线程同步同步概念与竞态条件条件变量条件变量本质 操作条件变量初始化和销毁条件变量等待唤醒 通过条件变量实现的简单线程同步例子为什么pthread_cond_wait需要互斥锁条件变量使用规范 生产者与消费者模型生活中的生产者与消…

jQuery学习记录--jQuery语法,选择器,事件及hide(),show(), toggle()

jQuery学习记录–jQuery语法&#xff0c;选择器&#xff0c;事件及hide&#xff08;&#xff09;&#xff0c;show()&#xff0c;toggle() jQuery 简介 jQuery 是一个 JavaScript 库。jQuery 极大地简化了 JavaScript 编程。 jQuery 库包含以下功能&#xff1a; HTML 元素选…

AMBER分子动力学模拟之结果分析(构象分析)-- HIV蛋白酶-抑制剂复合物(6)

AMBER分子动力学模拟之结果分析(构象分析)-- HIV蛋白酶-抑制剂复合物(6) RMSD RMSF b-facto计算 RMSD RMSD measures the deviation of a target set of coordinates (i.e. a structure) to a reference set of coordinates, with R M S D 0.0 \mathrm{RMSD}0.0 RMSD0.0 i…

【分享】又找到几个免费使用gpt4的方法!

哈喽&#xff0c;大家好&#xff0c;我是木易巷~ GPT-4是OpenAI推出的最新人工智能语言模型&#xff0c;拥有惊人的1750亿个参数&#xff0c;是目前最大、最强大的语言模型之一&#xff0c;能够根据给定的文本或关键词生成高质量的文本&#xff0c;可以处理多模态数据&#xf…

nodejs进阶(3)—路由处理

1. url.parse(url)解析 该方法将一个URL字符串转换成对象并返回。 url.parse(urlStr, [parseQueryString], [slashesDenoteHost]) 接收参数&#xff1a; urlStr url字符串 parseQueryString 为true时将使用查询模…

基于Vue框架的思源新闻发布平台设计与实现(论文+源码)_kaic

摘 要 经过针对全校随机抽取的100名学生进行的研究发现&#xff0c;有约69&#xff05;的学生&#xff0c;并不关心思源新闻&#xff0c;一些学生表示思源每天发生的大小事与他们无关。这项调查突显了需要提供一个能激发学生对思源校园新闻感兴趣的平台。因此本文为思源学院全…

今天面了个字节拿38K出来的,真是砂纸擦屁股,给我露一手

今年的春招已经结束&#xff0c;很多小伙伴收获不错&#xff0c;拿到了心仪的 offer。 各大论坛和社区里也看见不少小伙伴慷慨地分享了常见的面试题和八股文&#xff0c;为此咱这里也统一做一次大整理和大归类&#xff0c;这也算是划重点了。 俗话说得好&#xff0c;他山之石…

H264宏块包含的各种语法信息详解

H264宏块包含的各种语法信息详解 本文将以CABAC编码需要编码的语法元素的程序为例&#xff0c;分析H264宏块中所包含的各种语法元素的含义。 以上三种变量的其他情况分支&#xff0c;本文进行了省略处理&#xff0c;完整的&#xff0c;全分支的CABAC编码见参考资料【1】 1、 s…

vscode使用插件remote-ssh远程连接服务器

vscode使用插件remote-ssh远程连接服务器 0.引言1.配置密钥对1.1.本地端1.2.服务器端 2.服务器端配置3.vscode连接4.调试 0.引言 用上了公司百万级的服务器 &#x1f606; &#x1f606; &#x1f606; &#x1f606; 参考1参考2 1.配置密钥对 生成密钥对&#xff0c;是为了…

[离散数学]谓词逻辑与推理演算

文章目录 谓词逻辑辖域变元的约束---换自由变元 不容易出错枚举前束范式量词例子练习题特殊例子如果明天下雨&#xff0c;则某些人将被淋湿如果人都爱美,则漂亮的衣服有销路 谓词推理量词相关规则 (去量词 加量词) 谓词逻辑 辖域 变元的约束—换自由变元 不容易出错 枚举 前束范…

博客系统后端设计(五) - 实现登录页面功能

文章目录 约定前后端交互接口修改前段代码修改后端代码登录测试 约定前后端交互接口 这里约定请求是一个 POST 请求&#xff0c;路径是 /login&#xff0c;使用的是以下的格式&#xff1a; usernamzhangsan&password123 响应是 HTTP/1.1 302&#xff0c;因为在成功登录之…

SpringCloud(26.分布式服务框架Dubbo面试题简析)

上一篇&#xff1a;25. 简述 Seata 的原理 下一篇&#xff1a;27. Redis 和 ZK 分布式锁 文章目录 1. 为什么要将系统进行拆分&#xff1f;2. 如何进行系统拆分&#xff1f;3. 拆分后不用 dubbo 可以吗&#xff1f;4. dubbo 工作原理5. 注册中心挂了可以继续通信吗&#xff1…

【Drone】ubuntu 20.x 版本下 通过docker-compose方式部署drone的全流程 整合gitee

一、前期准备 1、ubuntu环境 确定是否具有 ssh&#xff1a; service ssh start&#xff0c;如果没有&#xff0c;使用&#xff1a;apt install openssh-server 进行安装查看 Linux 的 IP 地址&#xff1a; ifconfig&#xff0c;命令不可用时&#xff0c;通过&#xff1a;apt …

pdf太大,怎么压缩的小一点,这几个方法高效便捷

pdf太大&#xff0c;怎么压缩的小一点呢&#xff1f;我们在日常办公中&#xff0c;使用到pdf文件的情况很多。因为pdf文件可以在几乎所有操作系统和设备上打开&#xff0c;这使得它们非常方便。而且PDF 文件的内容和格式在不同设备之间始终保持一致&#xff0c;这意味着无论在哪…

PowerShell install 一键部署virtualbox

VirtualBox 前言 VirtualBox 是一款开源虚拟机软件。VirtualBox 是由德国 Innotek 公司开发&#xff0c;由Sun Microsystems公司出品的软件&#xff0c;使用Qt编写&#xff0c;在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。Innotek 以 GNU General Public Licens…

优思学院|什么是8D报告?

企业中的问题&#xff0c;就像生活中的麻烦事&#xff0c;总是层出不穷&#xff0c;让人头疼不已。有时候&#xff0c;我们可能会遇到一些棘手的问题&#xff0c;简单的方法已经无法解决了&#xff0c;这时候&#xff0c;8D问题解决法就是一把利器。 所以&#xff0c;我们不应…