selected_coding_interview/docs/237. 删除链表中的节点.md
普通情况:设前驱节点 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 为「代码注释解析」。
class Solution:
def deleteNode(self, node):
node.val = node.next.val
node.next = node.next.next
class Solution {
public void deleteNode(ListNode node) {
node.val = node.next.val;
node.next = node.next.next;
}
}
class Solution {
public:
void deleteNode(ListNode* node) {
node->val = node->next->val;
node->next = node->next->next;
}
};
class Solution:
def deleteNode(self, node):
# 复制 node.next 到 node
node.val = node.next.val
# 从链表中删除 node.next
node.next = node.next.next
class Solution {
public void deleteNode(ListNode node) {
// 复制 node.next 到 node
node.val = node.next.val;
// 从链表中删除 node.next
node.next = node.next.next;
}
}
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)$ : 使用常数大小额外空间。