zoukankan      html  css  js  c++  java
  • 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
    };
    不积跬步无以至千里
  • 相关阅读:
    将某个MySQL库中的UTF8字符列都转成GBK格式
    挺苹果的声音,iPhone 5s的两处进步
    Cookie 路径在本机测试及服务器部署,在浏览器处理方式上的不同
    inner join、left join、right join中where和and的作用
    TIA Portal V12不能添加新的CPU
    Linux下可执行程序调试信息的分离及release程序的调试
    STM32.定时器
    STM32.SPI(25Q16)
    模电之运放篇
    Zigbee学习
  • 原文地址:https://www.cnblogs.com/lyt0207/p/12369228.html
Copyright © 2011-2022 走看看