代码随想录算法训练营Day4 | 24.两两交换链表中的节点、19删除链表中的第N个节点、链表相交、142.环形链表

news2025/1/12 5:58:41

24.两两交换链表中的节点

题目:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

题目链接:24. 两两交换链表中的节点

卡哥的视频讲解:帮你把链表细节学清楚! | LeetCode:24. 两两交换链表中的节点

题目思考:定义一个虚拟头节点,对该节点后的两个节点进行操作,注意判断可循环条件以及定义变量来暂时储存节点。

交换过程如图:

代码示例:

代码逻辑详解:

  1. 首先创建一个虚拟头节点 dumyhead,值为 -1,并将其指向链表的头节点 head。这样做是为了处理头节点的特殊情况。

  2. 创建指针 cur 指向虚拟头节点 dumyhead,用于遍历链表。

  3. 创建临时指针 temp 用于指向待交换节点的前一个节点,即第一个要交换的节点的前一个节点。

  4. 创建临时指针 temp1 用于指向待交换节点的后一个节点的后一个节点,即第二个要交换的节点的后一个节点。

  5. 创建两个指针 firstsecond 分别指向待交换的两个节点。

  6. 进入循环,条件是 cur.nextcur.next.next 都不为 null,即链表中至少有两个节点。这样做是为了保证交换的两个节点是相邻的。

  7. 在循环中,首先保存好要交换的两个节点及其前后节点的位置,以便后续指针操作。

  8. cur.next 指向第二个节点 second,即将第二个节点提前。

  9. second.next 指向第一个节点 first,完成交换。

  10. first.next 指向之前保存的 temp1,即将第一个节点的下一个节点指向原来第二个节点的后一个节点。

  11. cur 指向交换后的第一个节点,为下一轮交换做准备。

  12. 循环结束后,返回虚拟头节点的下一个节点,即交换后的链表的头节点。

这样,整个链表中相邻节点的交换就完成了。

leetcode提交记录:

小tips:

1.先把节点交给指针之后,再进行交换,别忘了设置两个temp值

2.注意循环的条件,这里巧妙地将链表个数为偶数和奇数的情况都囊括了,当链表个数为偶数时,如果cur的下一个为空,则停止循环,如果链表个数为奇数时,则还需要同时满足cur下一个的下一个为空才会停止循环,这也是为什么只能用和而不能用或。注意!!

                     cur.next != null&&cur.next.next != null
这两个条件的顺序不能调换,否则会报空指针异常的错误。

19.删除链表的倒数第N个节点

题目:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

题目链接:19. 删除链表的倒数第 N 个结点

卡哥的视频链接:链表遍历学清楚! | LeetCode:19.删除链表倒数第N个节点

题目思考:要找到删除的节点,就要知道它的上一个节点是什么,我开始的想法是把链表反转过来,直接删除第n个节点,但是这个操作就复杂了,可以直接使用快慢指针。假如要删除倒数第n个节点,则让快指针先走n+1步(+1是为了让慢指针指向被删除节点的前一个),再让快慢指针同时走,当快指针指向空时,慢指针就走到被删除节点的前一个了。(如下图)

代码示例:

代码详细逻辑:

  1. 首先创建一个虚拟头节点 dummyhead,值为 -1,并将其指向链表的头节点 head。这样做是为了处理删除头节点的特殊情况。

  2. 创建两个指针 fastslow,都指向虚拟头节点 dummyheadfast 指针先向前移动 n+1 步,使其与 slow 指针相隔 n 个节点。

  3. 进入循环,条件是 fast 指针不为 null。在循环中,fast 指针和 slow 指针同时向前移动,直到 fast 指针指向 null,即到达链表的末尾。

  4. 循环结束后,slow 指针指向要删除节点的前一个节点,而 fast 指针指向要删除节点的后一个节点。

  5. 将要删除节点的前一个节点 slownext 指针指向要删除节点的下一个节点,从而将要删除的节点从链表中删除。

  6. 返回虚拟头节点的下一个节点,即删除节点后的链表的头节点。

这样,就完成了删除链表中倒数第 n 个节点的操作。

leetcode提交记录:

小tips:

1.一定要记得是让快指针走n+1步,这样慢指针才可以指向被删除节点的前一位,方便操作

2.定义快慢指针时,一定要定义在虚拟头节点的位置,如果在 head 的位置初始化快慢指针,那么在处理删除头节点的情况时就会变得复杂。因为如果要删除的是头节点,需要同时更新头节点 head 的位置,而且要处理头节点的特殊情况可能会引入更多的边界条件。

通过使用虚拟头节点 dummyhead,可以避免对头节点的特殊处理。虚拟头节点实际上是一个哨兵节点,它位于链表的头部,但不存储任何有效数据。这样,在处理链表的逻辑中,就可以统一对待头节点和其他节点,简化了代码逻辑,提高了代码的可读性和可维护性。

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

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

相关文章

蛋白质亚细胞定位预测(生物信息学工具-017)

直奔主题,下面这张表图怎么制作,一般都是毕业论文hh,蛋白质的亚细胞定位如何预测? 01 方法 https://wolfpsort.hgc.jp/ #官网小程序,简单好用,不用R包,python包,linux程序&#x…

Linux的学习之路:14、文件(1)

摘要 有一说一文件一天学不完,细节太多了,所以这里也没更新完,这里部分文件知识,然后C语言和os两种的文件操作 目录 摘要 一、文件预备 二、c文件操作 三、OS文件操作 1、系统文件I/O 2、接口介绍 四、思维导图 一、文件…

C++笔记:类和对象(一)

类和对象 认识类和对象 先来回忆一下C语言中的类型和变量,类型就像是定义了数据的规则,而变量则是根据这些规则来实际存储数据的容器。类是我们自己定义的一种数据类型,而对象则是这种数据类型的一个具体实例。类就可以理解为类型&#xff0c…

在Ubuntu 22.04上安装配置VNC实现可视化

前面安装的部分可以看我这篇文章 在Ubuntu 18.04上安装配置VNC实现Spinach测试可视化_ubuntu18开vnc-CSDN博客 命令差不多一样: sudo apt update sudo apt install xfce4 xfce4-goodies sudo apt install tightvncserver这个时候就可以启动server了 启动server&…

音频---数字mic

一、常见的数字mic pdm麦通过codec芯片将数字麦转换为i2s信号输入到SOC 纯pdm麦就是直接进入SOC的pdm接口,走的是PDM信号,PDM信号就是两个线,一根数据线一根时钟线(如顺芯ES7201/7202把MIC信号转换成PDM)。 二、DMIC…

等保合规:保护企业网络安全的必要性与优势

前言 无论是多部网络安全法律法规的出台,还是最近的“滴滴被安全审查”事件,我们听得最多的一个词,就是“等保。” 只要你接触安全类工作,听得最多的一个词,一定是“等保。” 那么,到底什么是“等保”呢…

Docker部署SpringBoot服务(Jar包映射部署)

介绍 项目在docker部署运行以后,每次需更新jar包时,都得重新制作镜像,再重新制作容器。流程及其繁琐,效率极低。 以下步骤是在不更新镜像和容器的前提下,直接更新jar完成项目更新的操作。 不重新制作镜像部署 1. 创…

Python简化远程部署和系统管理的工具库之fabric使用详解

概要 Python Fabric库是一个用于简化远程部署和系统管理的工具库。它提供了一组简洁而强大的函数和工具,可以帮助开发者轻松地在多台远程主机上执行命令、上传文件、下载文件等操作,从而实现自动化部署和管理。 安装 要使用Python Fabric库,首先需要安装Fabric模块。可以通…

OpenHarmony实战开发-如何使用text组件的enableDataDetector属性实现文本特殊文字识别。

介绍 本示例介绍使用text组件的enableDataDetector属性实现文本特殊文字识别。 效果图预览 使用说明 1.进入页面,输入带有特殊文字的信息并发送,对话列表中文本会自动识别并标识特殊文字。目前支持识别的类型包括电话号码、链接、邮箱和地址&#xff…

Zynq7000系列中PL时钟使用

可编程逻辑(PL)具有自己的时钟管理生成和分配功能,并从处理器系统(PS)中的时钟发生器接收四个时钟信号(如图25-10所示)。 在嵌入式系统中,PL时钟的管理和分配对于确保逻辑电路的正确…

协程的意义(二)

1.协程的意义 在一个线程中,如果遇到IO等待,线程不会一直在等待,而是利用空余时间去完成别的任务(充分利用线程)。 示例:下载图片 ①普通的方式下载图片(同步方式) ②使用协程的方…

发泡机液压站比例阀放大器

发泡机液压站是提供动力和压力以驱动发泡机工作的系统。 发泡机是一种用于制备聚氨酯发泡材料的设备,而液压站则扮演着为发泡机提供必要动力的角色。具体来看,液压站的主要组成包括: 液压油箱:存储液压油,为系统提供液…

【Applied Algebra】隐藏子群问题和Shor算法的新视角

隐藏子群问题和Shor算法的新视角 隐藏子群问题是指给定一个群和一个函数,该函数对于群的一个子群是常数,并且对于子群的任何两个不同的左陪集有不同的值,问题是找到这个子群.HSP是许多量子算法的基础,其中最著名的是Shor的算法,它可以用来分解大整数和计算离散对数,这直接威胁到…

小目标检测——鸟类数据集

引言 亲爱的读者们,您是否在寻找某个特定的数据集,用于研究或项目实践?欢迎您在评论区留言,或者通过公众号私信告诉我,您想要的数据集的类型主题。小编会竭尽全力为您寻找,并在找到后第一时间与您分享。 …

nvidia-smi CUDA Version:N/A

问题 nvidia-smi显示:CUDA Version:N/A nvidia-smi -a显示:CUDA Version: Not Found 解决方法 查看Nvidia驱动版本 nvidia-smi如下图,版本为530.41.03 搜索cuda库 apt search libcuda注:不同的源,同一个库的命…

轻量级SQLite可视化工具Sqliteviz

什么是 Sqliteviz ? Sqliteviz 是一个单页面离线优先的渐进式网络应用(PWA),用于完全客户端的 SQLite 数据库或 CSV 文件的可视化。 所谓完全客户端,就是您的数据库永远不会离开您的计算机。使用 sqliteviz&#xff0c…

PyQt程序:实现新版本的自动更新检测及下载(FTP服务器实现)

一、实现逻辑 本实例采用相对简单的逻辑实现,用户在客户端使用软件时点击“检测升级”按钮,连接至FTP服务器检索是否有新版本的.exe,如果有,下载最新的.exe安装升级。 本实例服务端待下载.exe所在目录结构 本实例客户端待更新.exe所在目录结构 二、搭建服务器 可以参考…

IMUGNSS的误差状态卡尔曼滤波器(ESKF)的数学模型

IMU&GNSS的误差状态卡尔曼滤波器(ESKF)的数学模型 把IMU视为运动模型,把GNSS观测视为观测模型,推导整个滤波器 设状态变量为 x [ p , v , R , b g , b a , g ] T x[p,v,R,b_{g},b_{a},g]^{T} x[p,v,R,bg​,ba​,g]T 所有变…

泛型的初步认识(2)

前言~🥳🎉🎉🎉 hellohello~,大家好💕💕,这里是E绵绵呀✋✋ ,如果觉得这篇文章还不错的话还请点赞❤️❤️收藏💞 💞 关注💥&#x…

【深度学习实战(11)】搭建自己的dataset和dataloader

一、dataset和dataloader要点说明 在我们搭建自己的网络时,往往需要定义自己的dataset和dataloader,将图像和标签数据送入模型。 (1)在我们定义dataset时,需要继承torch.utils.data.dataset,再重写三个方法…