环形链表知识点

news2024/12/28 8:06:09

目录

  • 判断链表中是否有环
  • 快慢指针步数问题

判断链表中是否有环

题目:给你一个链表的头节点 head ,判断链表中是否有环。
解决方法:使用快慢指针
如果两个快慢指针相遇,则有环。
如果没有相遇,则没有环。

但是这个原理是什么呢?
原理:当慢指针走到圆环的第一个节点,这时快指针已经进入到了圆环当中,慢指针走一步,快指针走两步,假设慢指针走到圆环当中的第一个节点时,慢指针和快指针相差N步
在这里插入图片描述

慢指针走一步,快指针走两步,那么快指针和慢指针之间相差的步数就是N+1-2 = N-1;
在这里插入图片描述

以此类推 N,N-1,N-2......0,每追击一次,距离减少1,距离为0,则表示追到了。
因此,慢指针和快指针会相遇,此时链表就是一个环形链表。

bool hasCycle(struct ListNode* head) {
    struct ListNode* slow = head;
    struct ListNode* fast = head;
    while (fast && fast->next) {
       slow = slow->next;
        fast = fast->next->next;
        if (slow == fast) {
            return true;
        }
        
    }
    return false;
}

快慢指针步数问题

那么请问,如果慢指针走一步,快指针走3步、4步、n步,也可以判断链表是否带环吗?请证明
1.情况1:慢指针走1步,快指针走3步
按照刚才的分析方法,我们可以知道慢指针走一步,快指针走3步,那么快指针和慢指针之间相差的步数就是N+1-3 = N-2;
在这里插入图片描述
如果N为偶数,则在第一轮时,就追上了。
如果N为奇数时,则要进行下一轮的追击。
假设环的长度为C,那么当N为奇数时,开始下一次的追击时,距离为-1的情况在这里插入图片描述
但是,如果C是偶数,则C-1是奇数,又会造成N是奇数,就会一直追击,则追不上。
如果C是奇数,则C-1是偶数,N就是偶数,在追击一轮就可追击成功。
因此,如果存在以下这种情况,那么就无法追击成功
“N为奇数,C为偶数同时存在”

但是,这种情况真的会存在吗?我们接下来讨论一下
假设头节点为head,慢指针为slow,快指针为fast
头指针到圆环的第一个节点的距离是L,此时慢指针也在圆环的第一个节点,快指针已经进入到了圆环内。
在这里插入图片描述
2*L的结果一定是偶数,如果N是奇数的话,那么C也必须是奇数,等式才会成立,偶数 = 奇数-奇数
如果·N是偶数的话,那么C也必须是偶数,等式才会成立,偶数=偶数-偶数
这两个条件都不满足
“N为奇数,C为偶数同时存在”
因此,当慢指针走一步,快指针走3步,不会被追击上的条件不成立,因此,当慢指针走一步,快指针走3步时,一定会被追击上。
2,情况2:慢指针走一步,快指针走4步
依旧按照上面的方法,我们可以知道慢指针走一步,快指针走4步,那么快指针和慢指针之间相差的步数就是N+1-4 = N-3;
在这里插入图片描述
在这里插入图片描述
这样之后,我们就要去讨论C的取值了,C-2,C-1…

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

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

相关文章

Linux——守护进程化(独立于用户会话的进程)

目录 前言 一、进程组ID与会话ID 二、setsid() 创建新会话 三、daemon 守护进程 前言 在之前,我们学习过socket编程中的udp通信与tcp通信,但是当时我们服务器启动的时候,都是以前台进程的方式启动的,这样很不优雅&#xff0c…

【LinuxC语言】setitimer与getitimer函数

文章目录 前言一、setitimer() 函数二、getitimer() 函数三、示例代码总结 前言 在Linux系统下,编写程序时经常需要使用定时器来实现一些定时任务、超时处理等功能。setitimer() 和 getitimer() 函数是两个用于操作定时器的重要函数。它们可以帮助我们设置定时器的…

第19章 基于质量特性的测试技术

一、功能性测试 (一)测试方法 等价类边界值法因果图法判定表法场景法 (二)用例 1、正常用例 2、异常用例 (三)完备性 1、功能覆盖率 2、X1-A/B 功能覆盖率X:软件实际功能覆盖文档中所有…

【Linux 网络】网络基础(一)(局域网、广域网、网络协议、TCP/IP结构模型、网络传输、封装和分用)-- 详解

一、计算机网络的发展背景 1、网络的定义 网络是指将多个计算机或设备通过通信线路、传输协议和网络设备连接起来,形成一个相互通信和共享资源的系统。 (1) 独立模式 独立模式 : 计算机之间相互独立。 (2)…

VMvare如何更改虚拟机内共享文件夹的挂载点

更改虚拟机内共享文件夹的路径 进入目录 /etc/init.d ,并找到vmware-tools文件 里面有配置项 vmhgfs_mnt"/mnt/hgfs" 将引号内的内容更改为你需要挂载的路径,重启即可 注意挂载的路径不能是 “/”,必须根目录下的某个文件夹,或者其子文件夹 …

在线OJ——链表经典例题详解

引言:本篇博客详细讲解了关于链表的三个经典例题,分别是:环形链表(简单),环形链表Ⅱ(中等),随机链表的复制(中等)。当你能毫无压力地听懂和成功地…

面试中算法(使用栈实现队列)

使用栈来模拟一个队列,要求实现队列的两个基本操作:入队、出队。 栈的特点:先入后出,出入元素都是在同一端(栈顶)。 队列的特点:先入先出,出入元素是在两端(队头和队尾)。 分析&…

深度学习:基于Keras,使用长短期记忆神经网络模型LSTM和RMSProp优化算法进行销售预测分析

前言 系列专栏:【机器学习:项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目,每个项目都处理一组不同的问题,包括监督和无监督学习、分类、回归和聚类,而且涉及创建深度学习模型、处理非…

springboot+vue课程作业成绩可视化大屏分析系统

教师的登录功能。 教师需要可以拥有每学期新增课程的功能。 新增的课程有作业成绩,考勤成绩,考试成绩,实验成绩,其中作业成绩是平时作业1到作业8的平均成绩,最后根据占比得出学期的总评成绩。(参考我发的表…

Shell编程debug

debug调试 debug方法 sh -x显示脚本执行过程set命令设置开始debug和结束debug的位置显示脚本某一部分执行过程,解决复杂脚本故障 示例: sh -x 显示脚本执行过程 set显示脚本的部分执行过程 set -x 开始调试,从这里开始显示脚本的详细执行过…

【C++】模板初阶:泛型编程的起点

💞💞 前言 hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页&#x…

day02-分布式事务

1.分布式事务问题 1.1.本地事务 本地事务,也就是传统的单机事务。在传统数据库事务中,必须要满足四个原则: 1.2.分布式事务 分布式事务,就是指不是在单个服务或单个数据库架构下,产生的事务,例如&#xf…

鸿蒙组件样式复用简介

鸿蒙组件样式复用简介 使用Style进行复用在Component内部复用在Component外部复用使用Extend复用指定类型组件Extend支持参数传递 使用Style进行复用 在页面开发过程中,会遇到多个组件都在使用相同的样式,这时候就要考虑是不是可以将相同的样式的进行复…

Python中的`return`语句详解

Python中的return语句详解 对于初学Python或任何编程语言的人来说,理解函数如何返回值是非常重要的。在Python中,return语句用于从函数中返回结果。本篇博客将详细介绍return语句的基本用法,以及如何在不同情境中有效使用它。 什么是return…

mac安装虚拟机linux系统

需要下载的有:centos8镜像 , 虚拟器 VMware 软件包 , Termius 或者xshell 1. CentOS系统下载 linux系统一般有: CentOS、ubuntu、redhat,选择一种进行安装就可以 CentOS 2024 年开始停止维护和发布 CentOS8的下载与安装(windows下安装) 镜…

cloudreve离线下载报错Insufficient capacity

报错内容: [Warning] 2024-05-03 22:57:40 Failed to update status of download task "c0xxxxxxxxx749": Insufficient capacity 使用motrix作为离线程序,报错后,会自动暂停下载 报错原因: 初始容量只有1G&#xff0c…

算法提高之潜水员

算法提高之潜水员 核心思想&#xff1a;二维01背包 两个容量v1v2注意状态计算时j和p可以<各自的v #include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N 1010,M 80,K 22;int f[K][M];int k,V1,V2;int main(){ci…

中国真实婚恋相亲服务平台有哪些?分享7款专注相亲交友的脱单软件平台

终于脱单了&#xff0c;盘点一下&#xff0c;我都有用过哪些脱单App&#xff5e; 第一个&#xff0c;珍爱网&#xff0c;作为老牌相亲软件&#xff0c;拥有线上和线下门店服务&#xff0c;海量会员。优点&#xff1a;资源多&#xff0c;软件使用界面整洁干净&#xff0c;设计人…

关于 Vue.js 双向数据绑定基本实现认知

写在前面 很早的一篇博客&#xff0c;整理了部分&#xff0c;蹭假期整理完博文内容涉及:双向数据绑定 实现方式简单介绍基于发布订阅、数据劫持的双向数据绑定两种不同实现(ES5/ES6) Demo&#xff0c;以及代码简单分析Object.defineProperty && Proxy API 介绍以及特性…

Web API之BOM

BOM 一、window的常见事件1.窗口加载事件2. 调节窗口大小事件 二、定时器1.setTimeout( , )2.setInterval()3.发送短信例子4.this指向问题 三、js执行机制四、location对象1.常见属性2.例子、3.常见方法 五、navigator对象六、history对象 简介&#xff1a; BOM是浏览器对象模型…