原题链接: 237. 删除链表中的节点 - 力扣(Leetcode)
tag: 链表.
一. 题目
有一个单链表的 head, 我们想删除它其中的一个节点 node.
给你一个需要删除的节点 node, 你将 无法访问 第一个节点 head.
链表的所有值都是 唯一的 , 并且保证给定的节点 node 不是链表中的最后一个节点.
删除给定的节点. 注意, 删除节点并不是指从内存中删除它, 这里的意思是:
- 给定节点的值不应该存在于链表中.
- 链表中的节点数应该减少 1.
node前面的所有值顺序相同.node后面的所有值顺序相同.
二. 题解
删除链表的节点的一般方法是锚定待删除节点的前驱节点 ( pos ), 修改 pos 的 next 指针, 使其指向待删除节点的后继节点, 再 delete 待删除的节点, 即可完成删除操作.
删除前.
ListNode* del = pos->next;
pos->next = del->next;
delete del;
删除后.
但是本题的接口只提供了待删除节点的地址 node , 并没有提供待删除节点的前驱节点的地址 (pos)!
于是我们采用如下做法.
删除前.
定位 node 节点的后继节点 temp.
ListNode* temp = node->next;
将 node 节点的 val 修改为 node 节点后继节点的 val.
node->val = temp->val;
将 node 节点的 next 指针修改为 node 节点后继节点的 next 指针.
node->next = temp->next;
删除 node 节点的后继节点.
node->next = temp->next;
完成节点的删除后.
三. 复杂度分析
时间复杂度: O(1).
空间复杂度: O(1).
四. 代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
void deleteNode(ListNode* node) {
ListNode* temp = node->next; // 定位 node 节点的后继节点 temp
node->val = temp->val; // 将 node 节点的 val 修改为 node 节点后继节点的 val
node->next = temp->next; // 将 node 节点的 next 指针修改为 node 节点后继节点的 next 指针
delete temp; // 删除 node 节点的后继节点
}
};