这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战
删除链表中的节点
该题出自力扣的237题——删除链表中的节点(简单题)
审题
请编写一个函数,用于 删除单链表中某个特定节点 。在设计函数时需要注意,你无法访问链表的头节点 head ,只能直接访问 要被删除的节点 。
题目数据保证需要删除的节点 不是末尾节点 。
-
简单概括就是需要删除链表的一个节点,但是不允许从头结点开始遍历;只能从给定要删除的节点开始
-
思路一:
-
一开始的话,可能会陷入一个误区,类似区块链的最长链原则;用新的链取代旧的链。给定当前的节点,只需要遍历往后的链表节点,从给定的节点开始,不断把当前节点定义值和next为下一节点——其实就是不断往后推移一位;
-
public static void deleteNode(ListNode node) { while(node != null){ node.val = node.next.val; node.next = node.next.next; node = node.next; } } -
但是,不难发现,这里会有几个问题;首先,姑且不从大体逻辑上去讨论,从执行代码角度——
node.val = node.next.val这行代码,一定会报空指针,因为不断往后推移一位,不是不可以;但是需要判断最后一位的推移后是null;相应的也就没有val了(类似数组越界)
-
从大局逻辑来看,其实并不需要对删除后的节点做任何逻辑处理;因为后续并不会有改动
-
-
思路二:
从评论区看到一条评论,可以说醍醐灌顶——如何让自己消失而又不死;杀死另一个人,并让自己取代他;
- 因为是单向链表,只需要将被删除的链表赋值+下一节点位置 → 下一节点就可以了
- 因为没有节点指向旧的下一个节点,所以,旧的下一节点等于是被废除了
编码
class Solution {
public void deleteNode(ListNode node) {
node.val = node.next.val;
node.next = node.next.next;
}
}