问题描述
请编写一个函数,使其可以删除某个链表中给定的(非末尾节点),你将只被给定要求被删除的节点。
示例1:
输入: head = [4, 5, 1, 9], node = 5
输出: head = [4, 1, 9]
示例1:
输入: head = [4, 5, 1, 9], node = 1
输出: head = [4, 5, 9]
说明:
- 链表至少包含两个节点
- 链表中所有节点的值是唯一的
- 给定的节点为非末尾节点并且一定是链表中的一个有效节点
- 不要从函数中返回任何结果
题干信息提取:
- 删除指定值节点;
- 链表没有保证排序,但值唯一
- 原地操作,不能打乱链表其余节点相对位置
- 无返回值,故函数为引用传递
问题分析
这个题目难度为“简单”,但是需要注意与Leetcode203的区别,这里是直接给了链表中的某个节点,是一个含有状态信息的另一个链表,所以这里仅需要对这单个节点node
链表操作即可,为方便讲解,我们假设给定一原始链表为图1所示:
图1
我们假设,需要删除的节点为0
,则需要返回的链表为图2:
图2
这里浅色的0即为已经删除的意思,由于题目的特殊性,数值均唯一且不是最后一个节点,我们可以考虑能够存在最简单的办法对节点进行删除。我们看到图2中0节点已经被舍弃,不妨将其设置为4,则有图3:
图3
图3中浅色的4即给定的node
位置,这时我们发现,对node
的后置节点可以操作,直接越过其node.next
连接到node.next.next
,则完成对指定node
的删除,结果如图4所示:
这里我们就完成了最少资源下指定一节点的删除功能思路分析。
步骤罗列
- 令
node
的值与node.next
值相等; - 将
node.next
连接到node.next.next
;
解题代码
public static void solutionWithP(ListNode head, ListNode node) {
node.val = node.next.val;
node.next = node.next.next;
}
复杂度分析
时间复杂度:这里我们并没有对链表进行遍历,而是直接在node
为首节点的链表基础上直接进行操作,故为O(1);
空间复杂度:我们没有初始化或设置额外的辅助容器,所以这里空间复杂度为O(1);
GitHub代码
完整的可运行文件参见GitHub。