环形链表知识点

ops/2024/9/23 2:33:44/

目录

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

判断链表中是否有环

题目:给你一个链表的头节点 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.ppmy.cn/ops/33804.html

相关文章

大学生上班族必备!九个线上兼职秘籍,让你远离失业风险

互联网时代,兼职新风尚:这些靠谱兼职让你轻松增收 随着互联网技术的飞速发展,兼职工作已成为许多人增加收入、提升自我能力的新选择。本文将为您揭秘一些适合大学生和上班族的靠谱兼职工作,助您轻松找到适合自己的兼职机会。 一…

Java学习之super VS this

在Java中,super和this关键字用于引用当前对象或父类对象的成员变量或方法。 一、super关键字: super关键字用于在子类中访问父类的成员变量或方法。使用super关键字调用父类构造方法。使用super关键字可以避免父类和子类中相同名称的变量或方法冲突。 …

TwinCAT3 实时内核调度算法

前言 TwinCAT3 支持多核心CPU并行运行实时任务,根据官方网站的帮助信息“实时”定义取自DIN44300,而且实时任务的调度算法默认是 RMS算法(速率单调调度算法) RMS算法 来看一下百度百科的解释: RMS(单调速…

解决Uncaught TypeError: Cannot read properties of null (reading ‘getAttribute‘)

问题: 用了element ui 的echart ,初始化时候找不到指定id的元素,导致的问题,如下 浏览器控制台输出的错误信息如下 Echars echarts.min.js:22 Uncaught TypeError: Cannot read properties of null (reading getAttribute)at echarts.min.…

Android使用kts发布aar到JitPack仓库

Android使用kts发布aar到JitPack 之前做过sdk开发,需要将仓库上传到maven、JitPack或JCenter,但是JCenter已停止维护,本文是讲解上传到JitPack的方式,使用KTS语法,记录使用过程中遇到的一些坑.相信Groovy的方式是大家经常使用的,…

结构体介绍(2)

结构体介绍(2) 前言一、结构体的内存对齐之深入理解为什么存在内存对齐?修改默认对齐数 二、结构体传参2.1:该怎么传参呢? 三、结构体实现位段3.1什么是位段位段的内存分配位段的跨平台问题 总结 前言 根据之前讲了结…

【八股】AQS,ReentrantLock实现原理

AQS 概念 AQS 的全称是 AbstractQueuedSynchronized (抽象队列同步器),在java.util.concurrent.locks包下面。 AQS是一个抽象类,主要用来构建锁和同步器,比如ReentrantLock, Semaphore, CountDownLatch,里…

使用python和pyqt开发的抽签小程序v1.0

使用python和pyqt开发的抽签小程序v1.0 作用效果代码 作用 对输入框中的文本进行随机抽取,抽取数量为3行。 效果 代码 import sys import random from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QTextEdit, QPushButton, QMessageBoxclass Ra…