链表题目:删除链表中的结点

题目

标题和出处

标题:删除链表中的结点

出处:237. 删除链表中的结点

难度

3 级

题目描述

要求

写一个函数,删除链表中的一个结点。传入的参数是要被删除的结点,即如果要被删除的结点不是链表的头结点,则无法访问链表的头结点。

题目保证要被删除的结点不是链表的尾结点。

示例

示例 1:

示例 1

输入: head   =   [4,5,1,9],   node   =   5 \texttt{head = [4,5,1,9], node = 5} head = [4,5,1,9], node = 5
输出: [4,1,9] \texttt{[4,1,9]} [4,1,9]
解释:给定你链表中值为 5 \texttt{5} 5 的第二个结点,在调用了你的函数之后,该链表应变为 4 → 1 → 9 \texttt{4} \rightarrow \texttt{1} \rightarrow \texttt{9} 419

示例 2:

示例 2

输入: head   =   [4,5,1,9],   node   =   1 \texttt{head = [4,5,1,9], node = 1} head = [4,5,1,9], node = 1
输出: [4,5,9] \texttt{[4,5,9]} [4,5,9]
解释:给定你链表中值为 1 \texttt{1} 1 的第三个结点,在调用了你的函数之后,该链表应变为 4 → 5 → 9 \texttt{4} \rightarrow \texttt{5} \rightarrow \texttt{9} 459

示例 3:

输入: head   =   [1,2,3,4],   node   =   3 \texttt{head = [1,2,3,4], node = 3} head = [1,2,3,4], node = 3
输出: [1,2,4] \texttt{[1,2,4]} [1,2,4]

示例 4:

输入: head   =   [0,1],   node   =   0 \texttt{head = [0,1], node = 0} head = [0,1], node = 0
输出: [1] \texttt{[1]} [1]

示例 5:

输入: head   =   [-3,5,-99],   node   =   -3 \texttt{head = [-3,5,-99], node = -3} head = [-3,5,-99], node = -3
输出: [5,-99] \texttt{[5,-99]} [5,-99]

数据范围

  • 链表中的结点数目在范围 [2,   1000] \texttt{[2, 1000]} [2, 1000]
  • -1000 ≤ Node.val ≤ 1000 \texttt{-1000} \le \texttt{Node.val} \le \texttt{1000} -1000Node.val1000
  • 链表中所有结点的值都是唯一的
  • 要被删除的结点 node \texttt{node} node 在链表中且不是尾结点

解法

思路和算法

删除链表中的一个结点,常规的做法是定位到要被删除的结点的前一个结点,然后改变前一个结点的 next \textit{next} next 指针的指向。这道题中,由于参数只有要被删除的结点,因此无法定位到要被删除的结点的前一个结点,需要使用其他做法。

对于给定的结点 node \textit{node} node,如果其后一个结点存在,则可以通过改变 node \textit{node} node next \textit{next} next 指针,删除其后一个结点。由于题目保证要被删除的结点 node \textit{node} node 不是链表的尾结点,因此 node \textit{node} node 的后一个结点一定存在,可以将其后一个结点删除。

但是题目要求删除的结点是 node \textit{node} node,而不是 node \textit{node} node 的后一个结点。由于删除结点的操作只会对 node \textit{node} node 及其后一个结点有影响,其他结点不受影响,因此只需要修改 node \textit{node} node 的值,即可达到删除 node \textit{node} node 的效果。

具体做法是,首先将 node \textit{node} node 的值设为其后一个结点的值,然后删除 node \textit{node} node 的后一个结点。

例如,给定链表 4 → 5 → 1 → 9 4 \rightarrow 5 \rightarrow 1 \rightarrow 9 4519,要被删除的结点 node \textit{node} node 是值为 5 5 5 的第二个结点,则删除结点的操作如下:

  1. node \textit{node} node 的值设为其后一个结点的值,链表变成 4 → 1 → 1 → 9 4 \rightarrow 1 \rightarrow 1 \rightarrow 9 4119

  2. 删除 node \textit{node} node 的后一个结点,链表变成 4 → 1 → 9 4 \rightarrow 1 \rightarrow 9 419

两步操作之后,链表中没有了值为 5 5 5 的结点,仍然有值为 1 1 1 的结点,且各结点之间的相对顺序不变,达到删除值为 5 5 5 的结点的效果。

代码

class Solution {
    public void deleteNode(ListNode node) {
        node.val = node.next.val;
        node.next = node.next.next;
    }
}

复杂度分析

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伟大的车尔尼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值