算法:删除链表节点

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. 我们无法访问链表头结点
  3. 要删除的节点不是末尾结点

所以我们可以作弊一下,通过不删除节点而是删除值的方法来达到目的:

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)
}

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值