【数据结构】链表专题3

news2024/12/24 9:07:06

前言

本篇博客我们继续来讨论链表专题,今天的链表算法题是经典中的经典

💓 个人主页:小张同学zkf

⏩ 文章专栏:数据结构

若有问题 评论区见📝

🎉欢迎大家点赞👍收藏⭐文章

目录

1.判断链表是否有环

2.返回入环的第一个节点

3.随机链表的复制


1.判断链表是否有环

这道题链表尾指针很有可能指向链表中任何一个节点,所以是带环的意思,当然尾指针很有可能指向他自己

所以我们分析一下,该怎么判断带有环,有些人直接说我就判断是否和我原来的值相等,相等的话就是代表有环,但这种情况不能确保一定有环,因为即使我没进环也有可能值相等,所以这个行不通,所以我们要判断的话还得需要快慢指针,若快指针追上慢指针代表这链表有环,为什么快指针追上慢指针就会带有环那?

 我们来画图分析一下

slow和fast最初都在头结点, 我们让fast一次走两步,slow一次走一步,假如没换那么fast或fast->next就会指向空,假如有环,那么fast先进环,slow后进环,若fast追上slow就证明了这个链表就带有环

代码如下

这道题曾经被一个面试官提出新的问题

为什么一定会相遇,有没有可能会错过,永远追不上?

我们先来看第一个问题,我们假设slow进环后与fast距离为N, 环的长度是C

那么fast追击slow的过程距离变化如下:

N为偶数                 N为奇数 

N                            N

N-2                         N-2

N-4                         N-4

……                       ……

4                             3

2                            1

0                             -1

可以看出N若为偶数追上了,若N为奇数,则代表fast错过了,需要新的一轮追击,此刻他们之间的距离就变成了C-1,继续追击,我们根据第一轮追击可以得知,C-1是偶数的话代表第二轮追上了,C-1还是奇数的话,又错了一位,距离又变成了C-1,C-1既然是奇数,那就代表永远追不上了

所以追不上的条件前提是,第二轮的C-1是奇数,第一轮的N是奇数,但我们想想这两个条件会不会同时存在

这里我们就需要用到数学列等式的思维来判断两个条件是否可以同时存在

我们假设进环之前的距离是L

那么slow刚进环时,slow走过的距离是L,此刻我们假设fast走了x圈,那fast走过的距离就是L+x*C+C-N

fast的距离是slow的三倍

那么就有了等式

3L=L+x*C+C-N

换算为:2*L=(x+1)*C-N

偶数=(x+1)*偶数-奇数

我们根据数学运算法则中 ,N是奇数时,C必须是奇数,才能使等式成立,N是偶数时,C必须也是偶数,才能使等式成立。

所以,当N是奇数时,C为奇数,C-1为偶数,所以C-1不可能为奇数,所以不可能永远追不上,肯定相遇。                       

结论:一定能追上

N是偶数第一轮就追上了

N是奇数第一轮追不上,第二轮就追上了


2.返回入环的第一个节点

上面那道题是判断是否有环,这道题就是若有环,返回环的第一个节点,所以我们还是需要用到快慢指针,我们画图表示

如图,这里其实有个非常巧妙的方法,我们让慢指针一次走一步,快指针一次走两步,直到环里相遇,再创建两个指针,一个从头开始走,另一个从快慢指针相遇的地方开始走,俩指针一次走一步,这俩指针若相遇,则相遇的点必定是进环的首节点

代码如下

可是为什么那?

我们还是用数学的方法来证明一下 

我们假设,环之前的距离是L,环的长度为C,相遇点与入环点的距离为N,在慢指针进入环点时,快指针走了x圈

那么相遇时,slow走的距离是L+N

fast走的距离是L+x*C+N

fast走的路程是slow两倍

那么就有了等式

2*(L+N)=L+x*C+N

最后换算成L=(x-1)*C+C-N

假如x=1,那么L=C-N,正好是相遇点到入环首节点的距离与入环之前的距离相等,那么此时在头结点与相遇节点创建俩指针同时走,正好相遇在入环首节点,证实了我们上面的代码想法,但有人会想,你这里假设为1呀,我让它不为一,不唯一的话,相当于在相遇节点的指针多走了几圈C,最后还是在入环首节点相遇。


3.随机链表的复制

这道题链表每个节点里多了个指针指向随机节点,也有可能指向空,然后我们要深拷贝一份(深拷贝意思就是把指针指向对应的值对应关系也要在新拷贝的链表中实现),有人说我直接遍历然后拷贝不就行了,硬拷贝是可以的,但是有个问题,随机指针(random)指向的值如何在新链表中实现,有人说我在新链表里继续找就行呀,但是我们仔细想一下,我们链表里值有可能有时相等,所以如果你先拷贝过去,然后再去找对应的值,可能找到的值不是原链表对应的值,而是值相等的那个位置的节点。

比如就会出现图上这个情况,11找的就不是原来第四位的7,而是第一位的7,这就没拷贝成功。

所以这道题这种做法是不行的

我们先想一下,这道题我们要是先靠拷贝一下,然后插在原节点的后面其拷贝的节点就与源节点有了对应的关联关系

我们画图看一下

这一步代码如下

第二步控制random,拷贝完了,那拷贝那一份链表里的random怎么找那,其实很简单,拷贝的random是不是就是原值的random的next(这一点仔细想想,这一点想明白,这道题就没什么难点了)

第二步代码如下

第三步尾插新链表,将拷贝在原链表的节点尾插新链表,并返回新链表的头结点

代码如下

这道题整体代码如下

相当于三个while嘛,一个while循环一步


结束语 

链表有关算法题也就总结完了,从链表专题1到3都是特别经典的算法题,我们一定要反复练习掌握,OK,感谢观看!!!

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

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

相关文章

基于Springboot的在线博客网站

基于SpringbootVue的在线博客网站的设计与实现 开发语言:Java数据库:MySQL技术:SpringbootMybatis工具:IDEA、Maven、Navicat 系统展示 用户登录 首页 博客标签 博客分类 博客列表 图库相册 后台登录 后台首页 用户管理 博客标…

layui中禁用div标签等操作

为了实现点击表格行后触发事件 然后去触发后进行操作 页面流程操作设置规定 不可编辑直接添加属性 class"layui-disabled"如果在最大的 div 设置不可编辑 但是内部有些还是可以触发使用的 所以就重写一下 取到当前 div 下的 所有的子元素 然后在给所有的子元素…

PE文件(三)节表作业

本次作业以notepad进行演示,如下是其在硬盘上的内存 1.手动解析节表 由标准pe头可知,一共由7个节也就是7个节表,可选pe头的大小是0X00F0,即240字节大小 根据上述我们所获取的信息,找到节表的首地址为0x01F8 .text …

Uniapp好看登录注册页面

个人介绍 hello hello~ ,这里是 code袁~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 🦁作者简介:一名喜欢分享和记录学习的…

docker 基础命令

docker 安装 更新系统 sudo apt update sudo apt -y dist-upgrade安装docker sudo apt-get -y install ca-certificates curl gnupg lsb-release sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/…

C语言——操作符保姆级教学(含整形提升及算数转换)

操作符 一.操作符的分类二.原码、反码、补码三.移位操作符1.左移操作符&#xff1a;<<2.右移操作符&#xff1a;>> 四.位操作符1.按位与—— &2.按位或—— |3.按位异或—— ^4.按位取反—— ~ 五.逗号表达式六.条件操作符七.操作符的属性&#xff1a;优先级、…

MATLAB 数据输出

MATLAB 数据输出 数据导出(或输出)在 MATLAB 的意思是写入文件。MATLAB 允许您在另一个读取 ASCII 文件的应用程序中使用您的数据。为此&#xff0c;MATLAB 提供了几个数据导出选项。 您可以创建以下类型的文件- 数组中的矩形、分隔的ASCII数据文件。 击键的日记&#xff08…

导数之光:探寻机器学习中的微变奥秘

在当今这个数据驱动的时代&#xff0c;机器学习以其强大的学习和预测能力&#xff0c;成为了推动科技进步的重要力量。而在机器学习的背后&#xff0c;数学原理&#xff0c;尤其是导数的应用&#xff0c;为其提供了坚实的理论支撑。本文将详细探讨导数在机器学习中的体现&#…

细说SVPWM原理及软件实现原理,关联PWM实现

细说SVPWM原理及软件实现原理&#xff0c;关联PWM实现 文章目录 细说SVPWM原理及软件实现原理&#xff0c;关联PWM实现1. 前言2. 基础控制原理回顾2.1 FOC 原理回顾2.2 细说 SVPWM2.2.1 矢量扇区计算2.2.2 矢量作用时间计算 2.2.3 如何理解 U4 U6 2/3Udc?2.2.4 如何理解 U4m…

flash attention 参数(笔记)

目录 一、flash attention官方 1.1、flash attention安装 二、flash attention 常见函数 2.1、flash_attn_varlen_qkvpacked_func 2.2、flash_attn_varlen_kvpacked_func 2.3、flash_attn_varlen_func ​​​​​​​2.4、flash_attn_with_kvcache 2.5、flash_attn_func 一、…

1. 深度学习笔记--神经网络中常见的激活函数

1. 介绍 每个激活函数的输入都是一个数字&#xff0c;然后对其进行某种固定的数学操作。激活函数给神经元引入了非线性因素&#xff0c;如果不用激活函数的话&#xff0c;无论神经网络有多少层&#xff0c;输出都是输入的线性组合。激活函数的意义在于它能够引入非线性特性&am…

魔方阵(C语言)

一、魔方阵规律&#xff1b; 8 1 6 3 5 7 4 9 2 魔方阵中各数的排列规律如下&#xff1a; (1)将1放在第1行中间一列。 (2)从2开始直到nn止&#xff0c;各数依次按此规则存放&#xff1a;每一个数存放的行比前一个数的行数减1&#xff0c;列数加1(例如上…

Go 语言基础(二)【数组、切片、指针、map、struct】

1、数组 特别需要注意的是&#xff1a;在 Go 语言中&#xff0c;数组长度也是数组类型的一部分&#xff01;所以尽管元素类型相同但是长度不同的两个数组&#xff0c;它们的类型并不相同。 1.1、数组的初始化 1.1.1、通过初始化列表{}来设置值 var arr [3]int // int类型的数…

HSDB使用教程

HSDB&#xff1a;Hostspot Debugger&#xff0c;JVM内置的工具&#xff0c;用于深入分析JVM运行时的内部状态 启动HSDB java -cp D:/tools/jdk-1.8/lib/sa-jdi.jar sun.jvm.hotspot.HSDB 获取进程id jps 连接到指定进程 查找类 通过查询查找对象 输入查询语句 select d from …

Linux 学习 --- 编辑 vi 命令

1、vi 基本概念&#xff08;了解&#xff09; 基本上 vi 可以分为三种状态&#xff0c;分别是命令模式 (command mode)、插入模式 (Insert mode) 和底行模式 (last line mode)&#xff0c;各模式的功能区分如下: 命令行模式 command mode&#xff09;  控制屏幕光标的移动&a…

「笔试刷题」:字母收集

一、题目 描述 有一个 &#x1d45b;∗&#x1d45a; 的矩形方阵&#xff0c;每个格子上面写了一个小写字母。 小红站在矩形的左上角&#xff0c;她每次可以向右或者向下走&#xff0c;走到某个格子上就可以收集这个格子的字母。 小红非常喜欢 "love" 这四个字母。…

kubernetes中使用ELK进行日志收集

目录 一、需要收集哪些日志 1、kubernetes集群的系统组件日志 2、应用日志 二、日志收集方案ELK 1、收集日志&#xff1a;Logstash 2、存储日志&#xff1a;Elasticsearch 3、展示日志&#xff1a;Kibana 三、安装elk 1、下载安装包 2、创建用户并切换到新用户 3、上…

【Web】CTFSHOW 中期测评刷题记录(1)

目录 web486 web487 web488 web489 web490 web491 web492 web493 web494 web495 web496 web497 web498 web499 web500 web501 web502 web503 web505 web506 web507 web508 web509 web510 web486 扫目录 初始界面尝试文件包含index.php&am…

ubuntu与redhat的不同之处

华子目录 什么是ubuntu概述 ubuntu版本简介桌面版服务器版 安装部署部署后的设置设置root密码关闭防火墙启用允许root进行ssh登录更改apt源安装所需软件 网络配置Netplan概述配置详解配置文件DHCP静态IP设置设置 软件安装方法apt安装软件作用常用命令配置apt源 deb软件包安装概…

基于React实现B站评论区

今天继续来学习一下React&#xff0c;使用React实现B站评论区&#xff0c;如下图&#xff1a; 在使用React开发类似B站评论区的功能时&#xff0c;我们需要考虑以下几个关键点来构建一个基本的评论系统&#xff1a; 1. 设计组件结构 首先&#xff0c;设计组件结构是关键。至少…