237. 删除链表中的节点
题目链接
https://leetcode.cn/problems/delete-node-in-a-linked-list/
相关算法
链表
题目描述
有一个单链表的 head
,我们想删除它其中的一个节点 node
。
给你一个需要删除的节点 node
。你将 无法访问 第一个节点 head
。
链表的所有值都是 唯一的,并且保证给定的节点 node
不是链表中的最后一个节点。
删除给定的节点。注意,删除节点并不是指从内存中删除它。
这里的意思是:
- 给定节点的值不应该存在于链表中。
- 链表中的节点数应该减少
1
。 node
前面的所有值顺序相同。node
后面的所有值顺序相同。
解题思路
本题与之前做过的链表题不同,其他链表题是给出了链表的头结点,然后指定删除节点,这道题是直接给了需要删除的节点,但是没有提供头结点。一开始我没有完全想明白题目意思,但还是根据题目给的条件想出通过递归来实现求解,也就是不删除除链表尾部节点之外的任何节点,只是将待删除节点后面所有的节点值往前移动。又因为节点 node
不是链表中的最后一个节点,所以可以简单判断当 node.next.next == null
时,就已经完成了对于链表所有值的移动操作,结束递归。
做完题目后,我去看了下官方题解,才发现实际上我想复杂了,虽然没有办法直接删除掉要删除的节点,但完全可以将下一个节点的值复制到当前节点,然后将需求转换为删除下一个节点,这样就轻松求解完毕了。
完整代码
递归
class Solution {
public void deleteNode(ListNode node) {
moveForward(node);
}
private void moveForward(ListNode node) {
node.val = node.next.val;
if (node.next.next == null) {
node.next = null;
return;
}
moveForward(node.next);
}
}
- 时间复杂度:
O(n)
- 空间复杂度:
O(1)
官方题解简单交换
// 作者:力扣官方题解
class Solution {
public void deleteNode(ListNode node) {
node.val = node.next.val;
node.next = node.next.next;
}
}
- 时间复杂度:
O(1)
- 空间复杂度:
O(1)