每日一题---OJ题: 环形链表

片头

嗨! 小伙伴们,大家好! 今天我们来讲讲这道OJ题----环形链表,准备好了吗? 我们开始咯!

题目似乎有点抽象,我们举几个例子哈

上图中,总共有4个结点,分别为 3, 2, 0, -4, 链表中有一个环,尾结点连接到第二个结点。

上图中,总共有2个结点,分别为 1, 2, 链表中有一个环, 尾结点连接到第一个结点。

上图中,链表没有环。

所以,我们解决这道题的关键,就是判断这个链表有没有环

这里,我们提供一种思路

思路一: 定义2个指针,分别为快指针和慢指针,假设慢指针每次走1步,快指针每次走2步。当它们相遇时,一定是出现了环,如果快慢指针没有相遇,那么链表中就没有环。

思路分析: slow指针走1步,fast指针走2步,一定可以追上吗? 会不会追不上?

当slow指针走到中间的时候,fast指针开始进环

当slow指针开始进环的时候,fast指针在环中可能已经走了n圈了

因为slow指针和fast指针都在环里面,slow指针进环以后开始追击。假设此时fast指针和slow指针之间的距离为N , 每追击一次,它们之间的距离缩小一步。

追击过程中, fast 和 slow 之间的距离变化
第0次:  N
第1次:  N-1
第2次:  N-2
第3次:  N-3
.........
第 n-2 次: 2
第 n-1 次: 1
第 n 次:    0 ---> 追上了

通过表格,我们可以发现,当 fast slow 之间的速度只相差1个单位的时候,(比如: fast一次走2步, slow一次走1步 ; fast一次走3步, slow一次走2步 ; fast一次走4步, slow一次走3步)不管它们之间的距离是奇数还是偶数, fast 都可以追上 slow。由此,我们就可以推断出一个结论: 前提是fast和slow之间只相差1个单位, 当fast追上slow的时候, 链表中一定有环; 如果fast已经为空,或者fast的next指针为空, 那么链表中无环

好滴,思路分析清楚了,那我们就要开始写代码啦!

等等,循环条件是啥嘞? 想想看, 如果单链表里面没有环,是不是fast指针最终为指向空 或者 fast的next指针指向空呢? 为什么会有两个条件呢?因为要分奇数个结点和偶数个结点呀!

(注意: 当单链表有奇数个结点并且链表中无环时, fast的next会先走到NULL ; 当单链表有偶数个结点并且链表中无环时, fast会先走到NULL)

好啦,这道题的代码如下:

 typedef struct ListNode ListNode;
bool hasCycle(struct ListNode *head) {
        ListNode* fast = head;  //fast指针指向头结点
        ListNode* slow = head;  //slow指针指向头结点

        while(fast && fast->next)//当fast为空或者fast->next为空,就跳出循环
        {
            fast = fast->next->next;//fast走2步
            slow = slow->next;      //slow走1步
            if(slow == fast){       //如果fast和slow相交,证明存在环
                return true;
            }
        }
        return false;               //如果fast走到空了,说明链表无环
}

 拓展部分:

slow走1步,fast走3步,一定能追上吗?

fast先进环,过一会儿,slow也会进环,假设这时fast和slow之间的距离为N,每追击一次,它们之间的距离缩小2步

追击过程中,fast和slow之间的距离变化
N为偶数N为奇数
第一次: N第一次: N
第二次: N-2第二次: N-2
第三次: N-4第三次: N-4
第四次: N-6第四次: N-6
........................
第 n-2 次: 4第 n-2 次: 3
第 n-1 次: 2第 n-1 次: 1
第 n 次:    0    -->追上了第 n 次:   -1  -->意味着它们错过了,但是因为在环里面,相当于进入新一轮的追击,它们之间的距离变成了 C-1 (假设C为环的长度)

如果 C-1 偶数,下一轮就追上了 ; 如果 C-1 奇数, 永远也追不上

片尾

今天我们学习了一道OJ题: 环形链表,希望能对看完这篇文章的友友们有所帮助 !   !   !

点赞收藏加关注 !   !   !

谢谢大家 !   !   !

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

抖音小店选品必经五个阶段,看你到哪一步了,直接决定店铺爆单率

大家好,我是电商笨笨熊 新手选品必经的阶段就是迷茫期,不知道怎么选品,在哪里选品,选择什么样的品; 而有些玩家也会在进入店铺后疯狂选品,但是上架的商品没有销量; 而这些都是每个玩家都要经…

JAVA也有自己的大模型生态

说到大模型好像已经绑定了Python语言,现在其他语言也有大模型生态了,它就是Spring AI 官网介绍:https://spring.io/projects/spring-ai#overview github:https://github.com/spring-projects/spring-ai 简单介绍 Spring AI 是 A…

SSL证书添加与ICP备案,对于SpringBoot的要求

配置了SSL证书之后,在SpringBoot的resources文件夹里的application.properties会添加以下代码: server.port443 不需要添加server.address。不然会报错。 https类型的请求默认在Postman里面不可请求。 经过SSL证书处理的网页,链接中使默认…

成为摄影拍照高手,摄影技术进阶秘籍

一、资料前言 本套摄影高手资料,大小2.02G,共有57个文件。 二、资料目录 DSLR数码单反摄影圣经.pdf photoshop超细的人像后期磨皮及专业美化.docx “失传”的人像拍摄绝技.doc 白加黑减.怎样应用曝光补偿.pdf 标准镜头秘笈:标准镜如何…

CSS3 常用样式

个人主页:学习前端的小z 个人专栏:HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论! 文章目录 ✍CSS3 常用样式💎1 CSS3 新增选择器🌹1.1 属性选择器…

002 若依管理系统前端vue3讲解 - svg雪碧图

小何hdc 跟着小何学编程 ☉本文由小何整理首发, 版权归本公众号所有, 如有侵犯,请自行删除! svg雪碧图 安装vite-plugin-svg-icons pnpm install vite-plugin-svg-icons -D 配置 src\main.js import { defineConfig } fr…

代码训练LeetCode(14)整数反转

代码训练(14)LeetCode之整数反转 Author: Once Day Date: 2024年4月9日 漫漫长路,才刚刚开始… 全系列文章可参考专栏: 十年代码训练_Once-Day的博客-CSDN博客 参考文章: 190. 颠倒二进制位 - 力扣(LeetCode)7. 整数反转 - 力扣&#xf…

基于springboot和vue的社团管理系统(含源码+sql+视频导入教程+文档+PPT)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于springboot和vue的社团管理系统1有三种角色 管理员:社团管理、类型管理、成员管理、活动管理、通知管理、费用管理等 团长:审核入团申请、发布活动、发布通知…

【教学类-52-03】20240412动物数独(4宫格)难度1-9 打印版

作品展示:合并打印(难度10%-90%,一共9份) 背景需求 前期两个代码完成了4宫格基本样式的制作 【教学类-52-01】20240411动物数独(4宫格)宫格图https://mp.csdn.net/mp_blog/creation/editor/137679361【教学…

投资组合中是否应该包括黄金

最近有朋友问我,你对黄金怎么看?现在可以买黄金吗? 这些问题问的很好啊。首先表明我的观点:黄金是投机不是投资,黄金的长期投资价值极低,在我的投资组合中配置黄金的比例不会超过5%。 可能有些朋友会反对…

LeetCode-416. 分割等和子集【数组 动态规划】

LeetCode-416. 分割等和子集【数组 动态规划】 题目描述:解题思路一:01背包问题,动规五部曲解题思路二:0解题思路三:0 题目描述: 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分…

MySQL知识整理

MySQL知识整理 基础第一讲:基础架构:一条SQL查询语句是如何执行的?架构尽量减少长连接的原因和方案为什么尽量不要依赖查询缓存 索引第四讲:深入浅出索引(上)第五讲:深入浅出索引(下…

图机器学习导论

图:描述关系数据的通用语言,起源于哥尼斯堡七桥问题 传统的机器学习:数据样本之间独立同分布,简单拟合数据边界,在传统的机器学习中,每个数据样本彼此无关。传统的神经网络,只能处理简单的表格、…

鱼眼摄像头畸变校正方法概述

1. 摘要 鱼眼摄像头以其独特的广阔视场和其他特点,在各个领域得到了广泛应用。然而,与针孔相机相比,鱼眼摄像头存在显著的畸变,导致拍摄的图像失畸变严重。鱼眼摄像头畸变是数字图像处理中常见的问题,需要有效的校正技…

产品3D模型在线展示快速实现教程

产品3D模型可以向潜在客户提供360度的观察角度,比平面图形的效果更好。快速实现产品3D模型的在线展示最简单的方法是使用NSDT 3DConvert的模型内嵌特性,无需任何开发工作,5分钟就可以完成: NSDT工具推荐: Three.js AI纹…

Python网络爬虫中JSON格式数据存储详解

目录 一、引言 二、JSON格式数据简介 三、Python中处理JSON数据 四、网络爬虫中获取JSON数据 五、存储JSON数据到文件 六、从文件中读取JSON数据 七、注意事项和常见问题 八、总结 一、引言 在网络爬虫的应用中,JSON格式数据以其轻量级、易读易写的…

备忘录模式:恢复对象状态的智能方式

在软件开发中,备忘录模式是一种行为型设计模式,它允许捕获并外部化对象的内部状态,以便在未来某个时刻可以将对象恢复到此状态。这种模式是撤销操作或者回滚操作的关键实现机制。本文将详细介绍备忘录模式的定义、实现、应用场景以及优缺点。…

基于51单片机智能家居空气质量监控—温湿度PM2.5

基于51单片机智能家居空气质量监控 (仿真+程序+原理图+PCB+设计报告) 功能介绍 具体功能: 1.检测温度、湿度、PM2.5浓度,并在LCD1602实时显示; 2.可以使用按键设置温湿度上下限、P…

rabbitmq安装rabbitmq-delayed-message-exchange插件

下载地址:Community Plugins | RabbitMQ 上传到rabbitmq安装目录的/plugins目录下 我的是/usr/lcoal/rabbitmq/plugins/ 直接安装 [rootk8s-node1 rabbitmq]# rabbitmq-plugins enable rabbitmq_delayed_message_exchange [rootk8s-node1 rabbitmq]# rabbitmq-pl…

UE源码编译报了403之后

今天编译一个早期版本的ue引擎,发现报了一个错误,如下图: 如上图所示。 第一反应是被墙了,然后发现并不是。查了下官方文档,发现是更新了一个下载检测。更新地址https://github.com/EpicGames/UnrealEngine/releases/t…