leetcode 237.删除链表中的节点

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

现有一个链表 -- head = [4,5,1,9],它可以表示为:

 

示例 1:

输入: head = [4,5,1,9], node = 5
输出: [4,1,9]
解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.

看到题目的第一眼以为时要从前往后遍历找那个要删除的节点,然后让那个节点的前一个节点指向要删除的节点的后一个节点,这样就删除了这个节点,可没想到不是这么一回事,而且还就给定了一个参数,

var deleteNode = function(node) {
        
    };

这不得最少需要两个参数吗?要删除的listnode,还有要删除第几个吧,懵逼,骂骂咧咧开始找答案。。。

var deleteNode = function(node) {
        node.val = node.next.val;
        node.next = node.next.next;
    };

把当前节点的data换成下一节点的data,链接地址换成下下一节点的链接地址,画图理解一下。

这能把当前的节点删除吗?明明删除的是当前节点的下一个节点啊。。。而且有的语言像c++好像没有垃圾回收机制吧,那这么写了根本都没有删除节点还得加个delete吧。

var deleteNode = function(node) {
        let del = node.next
        node.val = node.next.val;
        node.next = node.next.next;
        delete del
    };

我个人的理解是,之前删除节点都是给定一个链表ListNode,和要删除的数据,然后通过遍历来找那个要删除的数据,这次是直接给你定位到了那个要删除的节点,你不用再通过遍历来找了,也就不需要别的参数了,直接有node自身节点来搞定。

最终:

var deleteNode = function(head, val) {
    if(!head) return head
    //判断待删除的节点是否是头结点
    if(head.val === val) return head.next
    let pre = null
    let deleteNode = head
    // 指针向后移动,寻找待删除的节点
    while(deleteNode.val !== val) {
        pre = deleteNode
        deleteNode = deleteNode.next
    }
    // 通过更新指针来移除待删节点
        // 待删节点的前置节点的指针指向待删除节点的后一个节点
    pre.next = pre.next.next
    return head
};
不积跬步无以至千里
原文地址:https://www.cnblogs.com/lyt0207/p/12369228.html