Leetcode 237. 删除链表中的节点

413 阅读2分钟

原题链接: 237. 删除链表中的节点 - 力扣(Leetcode)

tag: 链表.

一. 题目

有一个单链表的 head, 我们想删除它其中的一个节点 node.

给你一个需要删除的节点 node, 你将 无法访问 第一个节点  head.

链表的所有值都是 唯一的 , 并且保证给定的节点 node 不是链表中的最后一个节点.

删除给定的节点. 注意, 删除节点并不是指从内存中删除它, 这里的意思是:

  • 给定节点的值不应该存在于链表中.
  • 链表中的节点数应该减少 1.
  • node 前面的所有值顺序相同.
  • node 后面的所有值顺序相同.

二. 题解

删除链表的节点的一般方法是锚定待删除节点的前驱节点 ( pos ), 修改 posnext 指针, 使其指向待删除节点的后继节点, 再 delete 待删除的节点, 即可完成删除操作.

删除前.

image.png

ListNode* del = pos->next;

image.png

pos->next = del->next;

image.png

delete del;

image.png

删除后.

image.png

但是本题的接口只提供了待删除节点的地址 node , 并没有提供待删除节点的前驱节点的地址 (pos)!

于是我们采用如下做法.

删除前.

image.png

定位 node 节点的后继节点 temp.

ListNode* temp = node->next;

image.png

node 节点的 val 修改为 node 节点后继节点的 val.

node->val = temp->val;

image.png

node 节点的 next 指针修改为 node 节点后继节点的 next 指针.

node->next = temp->next;

image.png

删除 node 节点的后继节点.

node->next = temp->next;

image.png

完成节点的删除后.

image.png

三. 复杂度分析

时间复杂度: 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 节点的后继节点
    }
};