237. 删除链表中的节点
请编写一个函数,用于 删除单链表中某个特定节点 。在设计函数时需要注意,你无法访问链表的头节点 head
,只能直接访问 要被删除的节点 。 题目数据保证需要删除的节点
示例 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
示例 3:
输入:head = [1,2,3,4], node = 3
输出:[1,2,4]
示例 4:
输入:head = [0,1], node = 0
输出:[1]
示例 5:
输入:head = [-3,5,-99], node = -3
输出:[5,-99]
来源:力扣(LeetCode)
解题思路1
常见删除
方法是将定位到要删除节点的上一个节点
,将上一个节点的next 指针
直接指向要删除节点的下一个节点
但在此题中
- 我们无法取得要删除节点的上一个节点
- 我们无法访问链表头结点
- 要删除的节点不是末尾结点
所以我们可以作弊一下,通过不删除节点而是删除值
的方法来达到目的:
1. 将被删除的节点转移到下个节点
2. 在这之前将被删节点node的值改为下个节点的值
/**
* Definition for singly-linked list.
* function ListNode(val) {
* this.val = val;
* this.next = null;
* }
*/
/**
* @param {ListNode} node
* @return {void} Do not return anything, modify node in-place instead.
*/
var deleteNode = function(node) {
node.val = node.next.val // 当前节点的值改为下个节点的值,例[4,5,1,9]中的5改为1,链表变为[4,1,1,9]
node.next = node.next.next // 删除下个节点,此时,node.next.next从[1,9]变为[9],链表最后为[4,1,9]
}
复杂度分析
时间复杂度:O(1),没有循环
空间复杂度: O(1), 没有任何数组或者矩阵
解题思路2
将要删除的元素和下一个元素合并成一个,使用 Object.assign(目标对象, 源对象, 源对象……)
方法
JS中的对象都是内存引用,也就是说 node 这个变量里只保存了内存地址
所以我们如果单纯的使用 node = node.next 方法是不行的,因为这仅仅改变了 node指针所指向的内存地址,node 与 node.next 都指向了node.next 的地址
Object.assign()方法是将所有源对象都合并到目标对象上并且覆盖在目标对象所指向的内存地址上
在这道题里,我们就是要把 node.next和 node合并,并存到 node 所指向的内存地址上,Object.assign()方法合并时,目标对象属性会被源对象中相同的属性覆盖,不同的属性添加到目标对象中,所以 node.next中的属性会覆盖 node
var deleteNode = function(node) {
Object.assign(node, node.next)
}