题目
标题和出处
标题:删除链表中的结点
难度
3 级
题目描述
要求
写一个函数,删除链表中的一个结点。传入的参数是要被删除的结点,即如果要被删除的结点不是链表的头结点,则无法访问链表的头结点。
题目保证要被删除的结点不是链表的尾结点。
示例
示例 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}
4→1→9。
示例 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}
4→5→9。
示例 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} -1000≤Node.val≤1000
- 链表中所有结点的值都是唯一的
- 要被删除的结点 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 4→5→1→9,要被删除的结点 node \textit{node} node 是值为 5 5 5 的第二个结点,则删除结点的操作如下:
-
将 node \textit{node} node 的值设为其后一个结点的值,链表变成 4 → 1 → 1 → 9 4 \rightarrow 1 \rightarrow 1 \rightarrow 9 4→1→1→9;
-
删除 node \textit{node} node 的后一个结点,链表变成 4 → 1 → 9 4 \rightarrow 1 \rightarrow 9 4→1→9。
两步操作之后,链表中没有了值为 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)。