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

news2025/5/25 20:02:35

片头

嗨! 小伙伴们,大家好! 今天我们来讲讲这道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题: 环形链表,希望能对看完这篇文章的友友们有所帮助 !   !   !

点赞收藏加关注 !   !   !

谢谢大家 !   !   !

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

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

相关文章

基于Springboot的汉服推广网站

基于SpringbootVue的汉服推广网站设计与实现 开发语言:Java数据库:MySQL技术:SpringbootMybatis工具:IDEA、Maven、Navicat 系统展示 用户登录页 首页 图文动态区 视频动态区 近期活动 汉服交流 汉服知识 后台登录页 后台首页…

牛客研究生复试刷题(1)

KY30进制转换 1.最开始没有考虑到大数问题,可以说是没考虑完全,输入类型使用的是int64_t,只ac了一半测试用例。所以在数很大找不到合适的数据类型存储时,要考虑使用string来存放。 2.使用string存放数字的时候就要考虑:字符和数字之间的转换。字符转换成数字:str[i]-0,…

第1章、react基础知识;

一、react学习前期准备; 1、基本概念; 前期的知识准备: 1.javascript、html、css; 2.构建工具:Webpack:https://yunp.top/init/p/v/1 3.安装node:npm:https://yunp.top/init/p/v/1 …

Java基础-知识点03(面试|学习)

Java基础-知识点03 String类String类的作用及特性String不可以改变的原因及好处String、StringBuilder、StringBuffer的区别String中的replace和replaceAll的区别字符串拼接使用还是使用StringbuilderString中的equal()与Object方法中equals()区别String a new String("a…

论文笔记:A Simple and Effective Pruning Approach for Large Language Models

iclr 2024 reviewer 评分 5668 1 intro 大模型网络剪枝的paper 在努力保持性能的同时,舍弃网络权重的一个子集现有方法 要么需要重新训练 这对于十亿级别的LLMs来说往往不现实要么需要解决依赖于二阶信息的权重重建问题 这同样可能带来高昂的计算成本——>引入…

ELK、ELKF企业级日志分析系统介绍

前言 随着企业级应用系统日益复杂,随之产生的海量日志数据。传统的日志管理和分析手段,难以做到高效检索、实时监控以及深度挖掘潜在价值。在此背景下,ELK日志分析系统应运而生。"Elastic" 是指 Elastic 公司所提供的一系列与搜索…

IDEA Warnings:SQL dialect is not configured.

springboot项目XxxMapper.xml文件打开后显示warnings:SQL dialect is not configured......(翻译:未配置SQL语言。) 大概意思是没有在IDEA中配置当前sql是MySQl、Oracle还是MariaDB等语言。 配置一下就好: 完了&#…

C语言: 字符串函数(下)

片头 在上一篇中,我们介绍了字符串函数。在这一篇章中,我们将继续学习字符串函数,准备好了吗?开始咯! 1.strncpy函数 1.1 strncpy函数的用法 strncpy是C语言中的一个字符串处理函数,它用于将一个字符串的一部分内容…

基于SpringBoot实现的在线拍卖系统

系统开发环境 编程语言:Java数据库:MySQL容器:Tomcat工具:IDEA/Ecilpse、Navicat、Maven 系统实现 管理员功能模块 首页 修改密码 用户管理 商品类型管理 拍卖商品 竞拍公告 轮播图 历史竞拍管理 竞拍订单管理 留言板管理 用户…

selenium添加代理(有账号密码)

以下为各种尝试的记录,正确实现可直接参考最后一条! 1,导入Proxy库来添加capabilities属性:可以访问网站,但ip还是本机ip from selenium import webdriver from selenium.webdriver.chrome.options import Options f…

【Java探索之旅】方法重载 递归

🎥 屿小夏 : 个人主页 🔥个人专栏 : Java编程秘籍 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言一、方法重载1.1 为什么要有方法重载1.2 方法重载的概念与使用1.3 方法签名 二、递归2…

网络篇05 | 应用层 http/https

网络篇05 | 应用层 http/https 01 HTTP请求报文协议(Request)1)Request简述2)请求行(首行)3)请求头(Request Headers)4)空行5)正文(Re…

2024年4月8日腾讯云故障复盘及情况说明

2024年4月8日15点23分,腾讯云团队收到告警信息,云API服务处于异常状态;随即在腾讯云工单、售后服务群以及微博等渠道开始大量出现腾讯云控制台登录不上的客户反馈。 经过故障定位发现,客户登录不上控制台正是由云API异常所导致。云…

commit 信息风格迥异、难以阅读,如何规范?

大家好!最近很长时间没有更新了,由于加入新团队新的项目组参与新的工作,导致博客创造搁置了一段时间,今天来记录一下我最近学习到的规范。 怎么写出符合 Angular 规范的 Commit Message 呢? 这是我们团队规定的规范。…

【免安装的MATLAB--MATLAB online】

目录: 前言账号的注册图片处理的示例准备图片脚本函数 总结 前言 在计算机、数学等相关专业中,或多或少都会与MATLAB产生藕断丝连的联系,如果你需要使用MATLAB,但是又不想要安装到自己的电脑上(它实在是太大了啊&#…

如何防止软件过度封装和抽象?

一、合适的软件架构 构建可读性强、高内聚、低耦合的软件架构是软件工程中的重要原则,这有助于提高代码的维护性、扩展性和复用性。以下是一些实践方法: 1. **模块化设计**:将系统划分为一系列职责单一、功能明确的模块或组件,每…

【新版】系统架构设计师 - 知识点 - 面向对象开发方法

个人总结,仅供参考,欢迎加好友一起讨论 文章目录 架构 - 知识点 - 面向对象开发方法面向对象开发方法面向对象的分析需求模型分析模型 面向对象的设计 用例模型关系、UML事务关系、类的关系 架构 - 知识点 - 面向对象开发方法 面向对象开发方法 分析阶段…

深度学习体系结构——CNN, RNN, GAN, Transformers, Encoder-Decoder Architectures算法原理与应用

1. 卷积神经网络 卷积神经网络(CNN)是一种特别适用于处理具有网格结构的数据,如图像和视频的人工神经网络。可以将其视作一个由多层过滤器构成的系统,这些过滤器能够处理图像并从中提取出有助于进行预测的有意义特征。 设想你手…

springboot数字化智慧城市管理系统源码

目录 ​系统开发环境 系统功能模块 系统特点 1、智慧城管移动端 2、案件受理 3、AI视频智识别分析 系统应用价值 1、提升案件办理效率 2、提升监管效能 3、提升行政执法水平 4、推进行政执法创新 智慧城管综合执法办案系统功能 现场移动执法 一般程序案件的网上办…

“Plandex:AI编程引擎革新,高效应对复杂任务“

Plandex Plandex 是一个开源的、基于终端的AI编程引擎,用于处理复杂任务。它通过长期运行的代理来完成跨越多个文件和多个步骤的任务,将大型任务分解为更小的子任务,然后逐个实现,直到完成整个工作。这有助于用户处理待办事项、处…