LeetCode --- 链表系列 --- 删除链表中的节点

删除链表中的节点

题目

请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点

你将只被给定要求被删除的节点。


现有一个链表 -- 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
}

原文地址:https://www.cnblogs.com/linjunfu/p/12856261.html