【数据结构】链表经典OJ题目练习(2)

面试题 02.02. 返回倒数第 k 个节点 - 力扣(LeetCode)

思路1:先计算出链表的长度,在将链表中的值存在数组中,在返回第k个节点。

思路2:利用快慢指针,先让快指针走k步,在让快慢指针分别同时走,当快指针走到空的时候,慢指针就是倒数第k个节点。

链表的回文结构_牛客题霸_牛客网 (nowcoder.com)

思路:先使用快慢指针找到来链表的中间节点,在将中间节点之后的链表倒置(注意倒置之后,中间链表的前一个节点依然指向尾结点),最后遍历链表,判断链表是否是回文结构。

160. 相交链表 - 力扣(LeetCode)

思路:先分别计算出两个链表的长度,算出它们长度之间的差值deference,再让长度较长的链表先走deference步,这样两个链表的长度就会相等,再进行遍历链表,找出相交点(注意,在寻找相交点的时候要找节点的地址,不能找节点的val值)。

141. 环形链表 - 力扣(LeetCode)

思路:使用快慢指针,如果fast或者fast->next为空的话说明链表不是一个环形链表,如果fast节点等于slow节点的话,说明fast追上了slow节点(fast一定会追上slow节点,这个结论会在下文解释到),也就说明了链表会进入一个环形的链表。

环形链表的几种情况:

那么,我们就要提出几个问题:

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

2.fast节点走3步,4步,或者n步是否可以与slow指针相遇?

先来解答第一个问题:

假设slow进入环的时候slow与fast节点的距离为N,fast节点每次走两步,slow节点每次走一步,所以每当slow节点走一步的时候,快慢指针之间的距离就会缩小1,直到它们之间的距离变为0.

slow走的步数                  fast与slow之间的距离

0                                      N

1                                      N-1

2                                      N-2

……                                 ……

x                                      0

第二个问题:

我们先来观察slow节点每次走1步和fast节点每次走3步时候的情况

这时候,我们需要分两种情况来分析两个指针:

a.当slow节点进入环的时候,快慢指针之间的距离N是一个偶数

b.当slow节点进入环的时候,快慢指针之间的距离N是一个奇数

slow走的步数         快慢指针之间的距离(N为偶数)       快慢指针之间的距离(N为奇数)

0                             N                                                     N

1                             N-2                                                  N-2

2                             N-4                                                  N-4

……                        ……                                                ……

x-1                          2                                                      1

x                             0                                                       -1

在这里,我们发现快慢指针之间的距离N是一个奇数时,fast与slow会错过,永远也不会相遇。

但是,先别急,这个结论真的正确吗?或者我们说快慢指针之间的距离N有可能是一个奇数吗?这就需要我们再次证明一下:

我们分析一下追上与追不上的情况:

1.N是偶数,第一轮就可以追上

2.N是奇数,第一轮追击就会错过,距离变成C-1

    a.如果C-1是偶数,下一轮就追上了

    b.如果C-1是奇数,那么就永远也追不上了

综上所述:同时存在N是奇数并且C是偶数,那么就永远也追不上了,我们接下来探讨的就是是否存在这种情况。

假设在slow节点进环时,slow节点走的长度为L ,fast节点走的距离为L+x*N+C-N,  整个环的长度为C。

在slow节点进环时,fast与slow节点分别走过的距离为:

fast:L+x*N+C-N  (x为快指针绕环走的圈数)

slow:L

接下来,因为fast节点走过的距离是slow节点走过的距离的3倍,所以我们会得到一个等式:

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

→2*L=x*C+C-N

→2*L=(x+1)*C-N

等式的左边一定是一个偶数,右边如果N是一个奇数,那么C一定也是一个奇数;右边如果是一个偶数,那么C一定也是一个偶数。所以就不会存在N是奇数并且C是偶数的情况。所以fast节点每次走3步的情况下,就不存在fast节点追不上slow节点的情况。

按这种方法证明其他fast节点走n步的情况,依然可以证明出fast节点一定可以追上slow节点的结论。

142. 环形链表 II - 力扣(LeetCode)

这道题目要求我们找到进入环形链表的节点,并且返回节点。

思路:首先找到快慢指针相遇的节点,此时,meet节点就是slow指针。meet指针到环形链表入口与head节点到环形链表的距离相等。

那么,为什么meet指针到环形链表入口与head节点到环形链表的距离相等呢?

证明:

我们假设head到入口的距离为L,入口到meet节点的距离为N,整个环的长度为C。

在相遇时,fast与slow节点分别走过的距离为:

fast:L+x*C+N  (x为快指针绕环走的圈数)

slow:L+N(slow指针在没有走完第一圈的时候就会被追上,因为当slow节点进入环的时候,fast指针已经在环中走了一段时间,二fast节点的速度有是slow节点的两倍,所以slow节点会在走完一圈之前就被fast节点追上)

接下来,因为fast节点走过的距离是slow节点走过的距离的两倍,所以我们会得到一个等式:

        2*fast=slow

→2*L+2*N=L+x*C+N

→       L+N=x*C

→            L=x*C-N

→            L=(x-1)*C+C-N

到这里我们会发现C-N的距离其实就是meet节点到环入口的距离,这个距离加上若干个环的长度就是L的长度。所以让meet节点和head节点分别同时走,它们一定会在环的入口处相遇。

138. 随机链表的复制 - 力扣(LeetCode)

思路:在每个节点之后创建一个节点并将节点的值赋给创建的节点,再将random指向cur->random->next。最后将创建出的链表尾插到一个新的链表中。

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

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

相关文章

【计算机科学速成课】笔记三——操作系统

文章目录 18.操作系统问题引出——批处理设备驱动程序多任务处理虚拟内存内存保护Unix 18.操作系统 问题引出—— Computers in the 1940s and early 50s ran one program at a time. 1940,1950 年代的电脑,每次只能运行一个程序 A programmer would write one at…

栈数据结构

1,概念 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈 顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压栈(push)&#x…

C语言 自定义类型——联合体

目录: 一、联合体是?声明计算内存大小 二、联合体的特点例如 三、联合体大小的计算规则: 四、应用习1习2 一、联合体是? 联合体和结构体差不多,但是其最大的区别在于联合体所有的成员共用一块内存空间。所以联合体也叫共用体。联…

Git同步代码

Git中5个区,和具体操作? 代码提交和同步代码 代码撤销和撤销同步 平时是怎么提交代码的? 第零步: 工作区与仓库保持一致第一步: 文件增删改,变为已修改状态第二步: git add ,变为已暂存状态 $ git status $ git a…

根据最近拒包项目总结,详细讲解Google最新政策(上)

关于占比最多的移动垃圾软件拒审问题 移动垃圾软件(Mobile Unwanted Software)特征表现1> 具有欺骗性,承诺其无法实现的价值主张。2> 诱骗用户进行安装,或搭载在用户安装的其他程序上。3> 不向用户告知其所有主要功能和重要功能。4> 以非预期方式影响用户的系统…

ComfyUI中的图像稀释处理

用下面的节点对图片进行稀释处理,如下 为0表示不变,我设置大一点,设置为0.5看看,如下 图像就暗淡了一些,但是还是有一些彩色的,相当于把它放在水里浸泡了一样,掉色了,这就是稀释&…

加密技术在保护企业数据中的应用

加密技术是企业数据保护的核心,对于维护信息安全至关重要。透明加密技术使文件加密后不改变用户对文件的使用习惯,内部文件打开自动解密,存储自动加密,一旦离开使用环境,加密文件将无法正常读取,从而保护文…

使用wxPython和pandas模块生成Excel文件

介绍: 在Python编程中,有时我们需要根据特定的数据生成Excel文件。本文将介绍如何使用wxPython和pandas模块来实现这个目标。我们将创建一个简单的GUI应用程序,允许用户选择输出文件夹和输入的Excel文件,并根据Excel文件中每个单…

神经网络极简入门

神经网络是深度学习的基础,正是深度学习的兴起,让停滞不前的人工智能再一次的取得飞速的发展。 其实神经网络的理论由来已久,灵感来自仿生智能计算,只是以前限于硬件的计算能力,没有突出的表现,直至谷歌的A…

25考研英语长难句Day01

Day01 【思考】:本句中有几处平行结构?分别是什么和什么平行并列呢?【a.生词、词组】【b.断开、简化】( 两步分析法)断开长难句的三步法:标点、连接词、分析主谓 【思考】:本句中有几处平行结构…

静电纺丝壳聚糖纳米纤维膜

静电纺丝壳聚糖纳米纤维膜是通过静电纺丝技术制备的一种由壳聚糖纳米纤维组成的薄膜材料。静电纺丝技术是一种有效的制备微纳米纤维的方法,可以将高分子溶液或熔体在静电场作用下喷射成纤维状物质,进而形成纳米纤维膜。 壳聚糖是一种天然高分子多糖&…

接口自动化测试的优势和适用场景!

接口自动化测试的优势和适用场景 在软件开发过程中,接口自动化测试是一项非常重要的任务。它可以帮助团队快速、准确地检测接口的功能、性能和稳定性,提高软件质量,节省时间和资源。本文将从0到1详细规划接口自动化测试的书写。 一、准备工…

洗地机什么牌子最好?618高性价比家用洗地机品牌

随着科技的发展,智能智能清洁家电越来越受到消费者的欢迎。洗地机作为其中的佼佼者,已经成为许多家庭清洁的好帮手。然而,面对满目琳琅的洗地机品牌型号,究竟哪一款机型适合家用呢,正好618也临近了,又有哪些…

Misc 流量分析

流量分析简介 网络流量分析是指捕捉网络中流动的数据包,并通过查看包内部数据以及进行相关的协议、流量分析、统计等来发现网络运行过程中出现的问题。 在CTF比赛中,以及各种技能大赛对于流量包的分析取证是一种十分重要的题型。通常这类题目都是会提供…

C语言判断字符旋转

前言 今天我们使用c语言来写代码来实现字符串选择的判断,我们来看题目 题目描述 写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。 例如:给定s1 AABCD和s2 BCDAA,返回1 给定s1abcd和s2ACBD,返回0. A…

创建操作手册知识库的终极指南

在繁忙的工作中,有一个方便好用的操作手册知识库能帮我们节省大量时间,避免走弯路。那么,如何创建这样一个知识库呢?下面就给大家讲解一下简单易学的创建步骤。 一、明确目标与需求 在创建操作手册知识库之前,首先要明…

本地运行AI大模型简单示例

一、引言 大模型LLM英文全称是Large Language Model,是指包含超大规模参数(通常在十亿个以上)的神经网络模型。2022年11月底,人工智能对话聊天机器人ChatGPT一经推出,人们利用ChatGPT这样的大模型帮助解决很多事情&am…

YOLOv5 V7.0 - rknn模型的验证 输出精度(P)、召回率(R)、mAP50、mAP50-95

1.简介 RKNN官方没有提供YOLOv5模型的验证工具,而YOLOv5自带的验证工具只能验证pytorch、ONNX等常见格式的模型性能,无法运行rknn格式。考虑到YOLOv5模型转换为rknn会有一定的精度损失,但是需要具体数值才能进行评估,所以需要一个…

python+flask+ldap3搭建简易版IDaaS系统(前端站点)

Python工具开源专栏 Py0006 pythonflaskldap3搭建简易版IDaaS系统(前端站点) Python工具开源专栏前言目录结构前端网站的部分演示首页查询数据数据同步数据关联查询系统日志 完整代码已在GitHub上开源 前言 pythonflaskldap3搭建简易版IDaaS系统的前端站…

SpringBoot指标监控

一.SpringBoot指标监控_添加Actuator功能 Spring Boot Actuator可以帮助程序员监控和管理SpringBoot应用,比如健康检查、内存使用情况统计、线程使用情况统计等。我 们在SpringBoot项目中添加Actuator功能,即可使用Actuator监控 项目,用法如…