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

本文主要是介绍代码随想录算法训练营Day4 | 24.两两交换链表中的节点、19删除链表中的第N个节点、链表相交、142.环形链表,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

这篇关于代码随想录算法训练营Day4 | 24.两两交换链表中的节点、19删除链表中的第N个节点、链表相交、142.环形链表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/920309

相关文章

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建

Go异常处理、泛型和文件操作实例代码

《Go异常处理、泛型和文件操作实例代码》Go语言的异常处理机制与传统的面向对象语言(如Java、C#)所使用的try-catch结构有所不同,它采用了自己独特的设计理念和方法,:本文主要介绍Go异... 目录一:异常处理常见的异常处理向上抛中断程序恢复程序二:泛型泛型函数泛型结构体泛型切片泛型 map三:文

MyBatis中的两种参数传递类型详解(示例代码)

《MyBatis中的两种参数传递类型详解(示例代码)》文章介绍了MyBatis中传递多个参数的两种方式,使用Map和使用@Param注解或封装POJO,Map方式适用于动态、不固定的参数,但可读性和安... 目录✅ android方式一:使用Map<String, Object>✅ 方式二:使用@Param

SpringBoot实现图形验证码的示例代码

《SpringBoot实现图形验证码的示例代码》验证码的实现方式有很多,可以由前端实现,也可以由后端进行实现,也有很多的插件和工具包可以使用,在这里,我们使用Hutool提供的小工具实现,本文介绍Sp... 目录项目创建前端代码实现约定前后端交互接口需求分析接口定义Hutool工具实现服务器端代码引入依赖获

利用Python在万圣节实现比心弹窗告白代码

《利用Python在万圣节实现比心弹窗告白代码》:本文主要介绍关于利用Python在万圣节实现比心弹窗告白代码的相关资料,每个弹窗会显示一条温馨提示,程序通过参数方程绘制爱心形状,并使用多线程技术... 目录前言效果预览要点1. 爱心曲线方程2. 显示温馨弹窗函数(详细拆解)2.1 函数定义和延迟机制2.2

C#实现插入与删除Word文档目录的完整指南

《C#实现插入与删除Word文档目录的完整指南》在日常的办公自动化或文档处理场景中,Word文档的目录扮演着至关重要的角色,本文将深入探讨如何利用强大的第三方库Spire.Docfor.NET,在C#... 目录Spire.Doc for .NET 库:Word 文档处理利器自动化生成:C# 插入 Word

MySQL中的DELETE删除数据及注意事项

《MySQL中的DELETE删除数据及注意事项》MySQL的DELETE语句是数据库操作中不可或缺的一部分,通过合理使用索引、批量删除、避免全表删除、使用TRUNCATE、使用ORDERBY和LIMI... 目录1. 基本语法单表删除2. 高级用法使用子查询删除删除多表3. 性能优化策略使用索引批量删除避免

Springmvc常用的注解代码示例

《Springmvc常用的注解代码示例》本文介绍了SpringMVC中常用的控制器和请求映射注解,包括@Controller、@RequestMapping等,以及请求参数绑定注解,如@Request... 目录一、控制器与请求映射注解二、请求参数绑定注解三、其他常用注解(扩展)四、注解使用注意事项一、控制

使用Python实现在PDF中添加、导入、复制、移动与删除页面

《使用Python实现在PDF中添加、导入、复制、移动与删除页面》在日常办公和自动化任务中,我们经常需要对PDF文件进行页面级的编辑,使用Python,你可以轻松实现这些操作,而无需依赖AdobeAc... 目录1. 向 PDF 添加空白页2. 从另一个 PDF 导入页面3. 删除 PDF 中的页面4. 在

Java轻松实现在Excel中插入、提取或删除文本框

《Java轻松实现在Excel中插入、提取或删除文本框》在日常的Java开发中,我们经常需要与Excel文件打交道,当涉及到Excel中的文本框时,许多开发者可能会感到棘手,下面我们就来看看如何使用J... 目录Java操作Excel文本框的实战指南1. 插入Excel文本框2. 提取Excel文本框内容3