题目来源:LeetCode237:删除链表中的节点
问题抽象:在单链表中删除指定节点(非尾节点),仅提供待删除节点引用(无头节点访问),需满足以下核心需求:
-
删除规则:
- 待删除节点
node不是尾节点(题目保证); - 操作后,链表中不再包含
node节点,且前后节点逻辑连接正确; - 禁止访问头节点,仅能操作
node及其后继节点。
- 待删除节点
-
实现约束:
- 时间复杂度 O(1)(仅常数次指针操作);
- 空间复杂度 O(1)(无额外数据结构);
- 核心技巧:
- 将
node的值替换为其后继节点的值; - 将
node的next指针绕过后继节点,直接指向后继的后继节点。
- 将
-
边界与副作用:
- 原后继节点被隐式删除(内存泄漏由语言 GC 管理);
- 若链表仅两节点(
node为头节点):- 删除后链表仅剩原后继节点(值已复制到
node);
- 删除后链表仅剩原后继节点(值已复制到
- 节点值类型为整数(32 位有符号整数)。
输入:单链表中的节点 node(待删除节点)
输出:无(直接修改链表结构)
解题思路
由于无法访问链表头节点,不能通过遍历定位前驱节点。核心思路是:
- 值覆盖:将当前节点的值替换为下一个节点的值
- 节点跳过:将当前节点的
next指向下下个节点 - 效果等价:
- 当前节点值被覆盖 → 原值从链表中消失
- 跳过下一节点 → 链表长度减 1
- 前后节点顺序保持不变
示例推导:
- 输入
[4,5,1,9], 删除5:- 覆盖值:节点
5→ 节点1的值 → 链表变为[4,1,1,9] - 跳过节点:节点
1(第一个)指向9→ 链表变为[4,1,9]
- 覆盖值:节点
代码实现(Java版)🔥点击下载源码
class Solution {
public void deleteNode(ListNode node) {
// 将下一个节点的值覆盖到当前节点
node.val = node.next.val;
// 当前节点直接指向下下个节点
node.next = node.next.next;
}
}
代码说明
- 值覆盖:
node.val = node.next.val→ 当前节点值被替换为后继节点值,使原值从链表中消失 - 节点跳过:
node.next = node.next.next→ 当前节点直接连接下下个节点,跳过原后继节点 - 关键点:
- 题目保证
node不是尾节点 → 可安全访问node.next - 节点值唯一 → 覆盖值不会冲突
- 内存高效 → 无额外空间开销,仅修改指针
- 题目保证
提交详情(执行用时、内存消耗)

1205

被折叠的 条评论
为什么被折叠?



