题目
请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。
示例 1:
输入: head = [4,5,1,9], node = 5
输出: [4,1,9]
解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
示例 2:
输入: head = [4,5,1,9], node = 1
输出: [4,5,9]
解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.
说明:
链表至少包含两个节点。
链表中所有节点的值都是唯一的。
给定的节点为非末尾节点并且一定是链表中的一个有效节点。
不要从你的函数中返回任何结果。
解题思路
这道题目实在是有些坑,看完描述心中呵呵,一个 for 循环找到待删除的节点,再将待删除的节点的上一节点的 next 指向待删除节点的下一节点,这不就搞定了吗,简单!一看代码,怎么入参只有一个啊,懵圏半天。
这就是这道题目需要注意的一个地方,实际上入参只有一个待删除节点的引用,也就是说,我们不知道待删除节点的上一个节点,也就无法将它的 next 指向待删除节点的下一节点。
问题不大,换个思路就是。
既然我们拿到的是待删除节点的引用,也就是说,待删除节点及其后面关联的节点,我们都有。此外题目中还指明待删除节点是一个非末尾结点、链表至少包含两个节点。
假设我们拿到的待删除节点是 4->5->6,我们要删除 4,那么只要用待删除节点的后一个节点的值覆盖待删除节点(此时变成5->5->6),再将待删除节点的 next 指向待删除节点的后一个节点的后一个节点即可(即 4 的 next 指向 6,此时变成 5->6, 5)。
代码
class Solution {
public void deleteNode(ListNode node) {
node.val = node.next.val;
node.next = node.next.next;
}
}