代码随想录算法训练营第 4 天(链表 2)| 24. 两两交换链表中的节点19.删除链表的倒数第N个节点 -

embedded/2025/1/14 18:20:11/

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

题目:24. 两两交换链表中的节点 - 力扣(LeetCode)

视频:帮你把链表细节学清楚! | LeetCode:24. 两两交换链表中的节点_哔哩哔哩_bilibili

讲解:代码随想录

dummy->1->2->3->

注意操作的顺序:

① dummy->2

② 2->1

③ 1->3

class Solution {public ListNode swapPairs(ListNode head) {if(head == null || head.next == null) return head;ListNode dummy = new ListNode(-1);dummy.next = head;     //1ListNode cur = dummy;ListNode slow, fast;while(cur.next != null && cur.next.next != null){ //3//在这里用cur同时定位slow和fast的相对位置   //2slow = cur.next;fast = slow.next.next;cur.next = slow.next;cur.next.next = slow;slow.next = fast;cur = slow;}return dummy.next;}
}

注意:

1、定义完虚拟头结点之后,记得连在头结点之前;

2、fast 和 slow 指针放在循环中,用cur同时定位slow和fast的相对位置,省了每次定位 fs 两个指针的代码;

3、这里不能写成 ||,因为写成 || 节点是奇数个就无法判断到后面的条件

只要 cur.nextcur.next.next 中有一个不为 null,循环就会继续。这意味着即使 cur.nextnull,只要 cur.next.next不为 null,循环仍然会继续,这会导致 NullPointerException,因为你试图访问 nullnext属性。

尝试过程:

class Solution {public ListNode swapPairs(ListNode head) {if(head == null || head.next == null) return head;ListNode dummy = new ListNode(-1);dummy.next = head;   //ListNode cur = dummy;ListNode slow = head;ListNode fast = head.next.next;while(cur.next != null || slow.next != null){cur.next = slow.next;cur.next.next = slow;slow.next = fast;cur = slow;slow = fast;fast = slow.next.next;    //这里有问题}return dummy.next;}
}

在处理链表成对交换时存在一些逻辑问题,特别是在更新fast指针和处理链表末尾的部分,报了空指针异常。

解决办法是:把 fast 和 slow 指针放在循环里改变

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

题目:19. 删除链表的倒数第 N 个结点 - 力扣(LeetCode)

视频:链表遍历学清楚! | LeetCode:19.删除链表倒数第N个节点_哔哩哔哩_bilibili

讲解:代码随想录

双指针的经典应用

思路: 如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。

class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {if(head == null) return null;ListNode dummy = new ListNode(-1, head);  //1ListNode fast = dummy, slow = dummy;for(int i=0; i<=n; i++){    //2fast = fast.next;}while(fast!=null){  //3fast = fast.next;slow = slow.next;}slow.next = slow.next.next;return dummy.next;        }
}

注意:

1、接在 head 之前用这一步写就行: 初始化一个空结点,初始赋值为0,并且list的下一个next指针指向head,指针指向为list: ListNode list=new ListNode(0,head);

2、注意终止条件,如果是 i<=n,加上=,slow 指针到时可以刚好停在删除元素的前一个节点

3、终止条件是 fast 判空,不是 fast.next 判空

尝试过程:

class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {if(head == null) return -1;   //1ListNode dummy = new ListNode(-1, head);ListNode fast = dummy, slow = dummy;for(int i=0; i<=n; i++){fast = fast.next;}while(fast.next!=null){   //2fast = fast.next;slow = slow.next;}slow.next = slow.next.next;return dummy.next;}
}

1、返回值类型错误:如果链表为空,应该返回null而不是-1,因为-1不是一个有效的链表节点。

2、见上面

三、面试题 02.07. 链表相交

同:160.链表相交

题目:面试题 02.07. 链表相交 - 力扣(LeetCode)

视频:

讲解:代码随想录


四、142.环形链表II

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

视频:把环形链表讲清楚! 如何判断环形链表?如何找到环形链表的入口? LeetCode:142.环形链表II_哔哩哔哩_bilibili

讲解:代码随想录



http://www.ppmy.cn/embedded/153602.html

相关文章

Github 2025-01-10 Java开源项目日报Top8

根据Github Trendings的统计,今日(2025-01-10统计)共有8个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目8TypeScript项目1Kotlin项目1C++项目1JeecgBoot 企业级低代码开发平台 创建周期:2062 天开发语言:Java, Vue协议类型:Apache License…

预编译SQL

预编译SQL 预编译SQL是指在数据库应用程序中&#xff0c;SQL语句在执行之前已经通过某种机制&#xff08;如预编译器&#xff09;进行了解析、优化和准备&#xff0c;使得实际执行时可以直接使用优化后的执行计划&#xff0c;而不需要每次都重新解析和编译。这么说可能有一些抽…

MySQL索引覆盖(覆盖索引, Covering Index)

文章目录 说明MySQL索引覆盖&#xff08;覆盖索引, Covering Index&#xff09;覆盖索引的概念覆盖索引的示例示例查询及索引覆盖情况覆盖索引的性能优势覆盖索引的实现条件覆盖索引 vs 非覆盖索引覆盖索引的限制如何设计覆盖索引覆盖索引的实际案例场景 1&#xff1a;电商系统…

PyQt5按钮类控件Button

一、PushButton 开发中经常会用到的功能&#xff1a; 1.点击。 2.设置默认按钮。 3.设置按钮为可切换状态按钮。 1.方法 方法名称作用备注setText(QString)设置按钮上的文字&#xff0c;参数值为字符串text()获取按钮上的文字setIcon(QIcon)设置按钮icon&…

Elasticsearch(四)

Elasticsearch Java API 操作1.1 引入依赖1.2 客户端对象1.3 索引操作1.3.1 创建索引1.3.2 查看索引1.3.3 删除索引 1.4 文档操作1.4.1 新增文档1.4.2 修改文档1.4.3 查询文档1.4.4 删除文档1.4.5 批量新增1.4.6 批量删除 1.5 高级查询1.5.1 请求体查询1.5.1.1 查询所有索引数据…

网络安全-web渗透环境搭建-BWAPP(基础篇)

01--所需系统环境&#xff1a; 虚拟主机系统部署&#xff08;vmware&#xff0c;虚拟主机创建、虚拟主机网络配置&#xff08;桥接&#xff0c;便于网络中多个主机都能访问虚拟主机&#xff09;、虚拟软件功能&#xff0c;快照、克隆、镜像文件加载&#xff0c;ova文件制作&am…

STM32如何测量运行的时钟频率

前言 环境&#xff1a; 芯片&#xff1a;STM32F103C8T6 Keil&#xff1a;V5.24.2.0 一、简介STM32F103C8T6的时钟源 ①HSI 内部高速时钟,RC振荡器&#xff0c;频率为8MHz&#xff0c;精度不高。②HSE 外部高速时钟,可接石英/陶瓷谐振器&#xff0c;频率范围为4MHz~16MHz&…

Spring Framework 5.3.x源码构建 (jdk-1.8, gradle 7.5.1, idea2024.3)

1、下载jdk安装并配置环境变量&#xff08;自行百度&#xff09; https://www.oracle.com/java/technologies/downloads/#java8 2、下载spring-framework源码&#xff0c;切换分支到5.3.x https://github.com/spring-projects/spring-framework.git 备用地址 https://gitco…