算法小知识----11.04----删除链表中的节点

261 阅读2分钟

这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战

删除链表中的节点

该题出自力扣的237题——删除链表中的节点(简单题)

审题

请编写一个函数,用于 删除单链表中某个特定节点 。在设计函数时需要注意,你无法访问链表的头节点 head ,只能直接访问 要被删除的节点 。

题目数据保证需要删除的节点 不是末尾节点 。

1635816705(1).jpg

  • 简单概括就是需要删除链表的一个节点,但是不允许从头结点开始遍历;只能从给定要删除的节点开始

  • 思路一:

    • 一开始的话,可能会陷入一个误区,类似区块链的最长链原则;用新的链取代旧的链。给定当前的节点,只需要遍历往后的链表节点,从给定的节点开始,不断把当前节点定义值和next为下一节点——其实就是不断往后推移一位;

    •     public static void deleteNode(ListNode node) {
              while(node != null){
                  node.val = node.next.val;
                  node.next = node.next.next;
                  node = node.next;
              }
          }
      
    • 但是,不难发现,这里会有几个问题;首先,姑且不从大体逻辑上去讨论,从执行代码角度——

      node.val = node.next.val这行代码,一定会报空指针,因为不断往后推移一位,不是不可以;但是需要判断最后一位的推移后是null;相应的也就没有val了(类似数组越界)

    • 从大局逻辑来看,其实并不需要对删除后的节点做任何逻辑处理;因为后续并不会有改动

  • 思路二:

    从评论区看到一条评论,可以说醍醐灌顶——如何让自己消失而又不死;杀死另一个人,并让自己取代他;

    • 因为是单向链表,只需要将被删除的链表赋值+下一节点位置 → 下一节点就可以了
    • 因为没有节点指向旧的下一个节点,所以,旧的下一节点等于是被废除了

编码

class Solution {
    public void deleteNode(ListNode node) {
            node.val = node.next.val;
            node.next = node.next.next;
    }
}

1635817990(1).jpg