解题思路:
普通情况:设前驱节点 pre 、当前节点 cur 、后继节点 cur.next ,则执行 pre.next = cur.next 可将节点 cur 从链表中删除。

本题仅传入「待删除节点 node 」,由于普通链表只有「单向指针」,因此无法访问到 node 的「前驱节点」,进而无法使用以上方法删除节点 node 。
为了删除节点 node ,可使用以下方法:
- 复制后继节点
node.next的「节点值」至节点node; - 使用上述方法将
node.next从链表中删除即可;
如下图所示,示例链表 $4 \rightarrow 5 \rightarrow 1 \rightarrow 9$ 和待删除节点 $5$ ,完成删除后链表变为 $4 \rightarrow 1 \rightarrow 9$ 。
<
,
,
>
代码:
后三个 Tab 为「代码注释解析」。
Python
class Solution:
def deleteNode(self, node):
node.val = node.next.val
node.next = node.next.nextJava
class Solution {
public void deleteNode(ListNode node) {
node.val = node.next.val;
node.next = node.next.next;
}
}C++
class Solution {
public:
void deleteNode(ListNode* node) {
node->val = node->next->val;
node->next = node->next->next;
}
};Python
class Solution:
def deleteNode(self, node):
# 复制 node.next 到 node
node.val = node.next.val
# 从链表中删除 node.next
node.next = node.next.nextJava
class Solution {
public void deleteNode(ListNode node) {
// 复制 node.next 到 node
node.val = node.next.val;
// 从链表中删除 node.next
node.next = node.next.next;
}
}C++
class Solution {
public:
void deleteNode(ListNode* node) {
// 复制 node.next 到 node
node->val = node->next->val;
// 从链表中删除 node.next
node->next = node->next->next;
}
};复杂度分析:
时间复杂度 $O(1)$ : 使用常数时间。
空间复杂度 $O(1)$ : 使用常数大小额外空间。