请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点
你将只被给定要求被删除的节点。
现有一个链表 --?head =?[4,5,1,9],它可以表示为:
说明:
链表至少包含两个节点。
链表中所有节点的值都是唯一的。
给定的节点为非末尾节点并且一定是链表中的一个有效节点。
不要从你的函数中返回任何结果。
示例 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.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/delete-node-in-a-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
渐进解法 1
1、可以直接将 node 替换成 node.next
即 node 的 val 替换成功 node.next 的 val
即 node 的 next 替换成功 node.next 的 next
渐进解法 2
1、使用 浏览器原生 api 进行浅拷贝
Object.assign(node, node.next)
渐进解法 1
// 用时较好,内存消耗较好
执行用时: 68 ms
内存消耗: 35.4 MB
let deleteNode = function(node) {
// node 为当前需要删除的节点
// 执行删除操作,实际是让 node 节点的下一个节点 node.next 前进一位
// 我们可以直接将 node 替换成 node.next
// 即 node 的 val 替换成功 node.next 的 val
// 即 node 的 next 替换成功 node.next 的 next
node.val = node.next.val
node.next = node.next.next
}
渐进解法 2
// 用时较好,内存消耗较好
执行用时: 68 ms
内存消耗: 35.4 MB
let deleteNode = function(node) {
// 或者浅拷贝
Object.assign(node, node.next)
}
错误题解:
let deleteNode = function(node) {
// 错误解法:
// 原本 局部变量 node 存储的是外部链表对象的 内存地址
// 使用 node = node.next 是对 局部变量 node 的重新赋值, node 不再指向 外部链表内存地址
// 外部链表不会改变,所以这么写是不行的
node = node.next
}
LeetCode --- 链表系列 --- 删除链表中的节点
原文:https://www.cnblogs.com/linjunfu/p/12856261.html