zl程序教程

您现在的位置是:首页 >  后端

当前栏目

剑指 Offer 18. 删除链表的节点

链表节点 删除 Offer 18
2023-09-14 09:13:11 时间

剑指 Offer 18. 删除链表的节点

难度: e a s y \color{Green}{easy} easy


题目描述

给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。

返回删除后的链表的头节点。

注意: 此题对比原题有改动

示例 1:

输入: head = [4,5,1,9], val = 5
输出: [4,1,9]
解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.

示例 2:

输入: head = [4,5,1,9], val = 1
输出: [4,5,9]
解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.

说明:

  • 题目保证链表中节点的值互不相同
  • 若使用 C 或 C++ 语言,你不需要 f r e e free free d e l e t e delete delete 被删除的节点

算法

(链表操作)

声明一个哑结点 dummy ,前驱节点 p,当前节点 q,如果当前节点的 值不等于要删除的节点的值,就让 p q 分别后移一位,如果相等,就更新 p->next = q->next 。跳过当前的点。

复杂度分析

  • 时间复杂度 O ( n ) O(n) O(n),其中 n n n 是链表的长度。需要遍历链表一次

  • 空间复杂度 : O ( 1 ) O(1) O(1)

C++ 代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* deleteNode(ListNode* head, int val) {
        auto dummy = new ListNode(0);
        auto p = dummy, q = head;
        p->next = q;

        while (q) {
            if (q->val == val) {
                p->next = q->next;
            }
            p = q;
            q = q->next;
        }
        return dummy->next;
    }
};