算法修炼之路——【链表】Leetcode237 删除链表中节点

问题描述

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

示例1:

输入: head = [4, 5, 1, 9], node = 5
输出: head = [4, 1, 9]

示例1:

输入: head = [4, 5, 1, 9], node = 1
输出: head = [4, 5, 9]

说明:

  • 链表至少包含两个节点
  • 链表中所有节点的值是唯一的
  • 给定的节点为非末尾节点并且一定是链表中的一个有效节点
  • 不要从函数中返回任何结果

题干信息提取:

  1. 删除指定值节点;
  2. 链表没有保证排序,但值唯一
  3. 原地操作,不能打乱链表其余节点相对位置
  4. 无返回值,故函数为引用传递

问题分析

这个题目难度为“简单”,但是需要注意与Leetcode203的区别,这里是直接给了链表中的某个节点,是一个含有状态信息的另一个链表,所以这里仅需要对这单个节点node链表操作即可,为方便讲解,我们假设给定一原始链表为图1所示:
在这里插入图片描述
图1

我们假设,需要删除的节点为0,则需要返回的链表为图2:
在这里插入图片描述
图2

这里浅色的0即为已经删除的意思,由于题目的特殊性,数值均唯一且不是最后一个节点,我们可以考虑能够存在最简单的办法对节点进行删除。我们看到图2中0节点已经被舍弃,不妨将其设置为4,则有图3:
在这里插入图片描述
图3

图3中浅色的4即给定的node位置,这时我们发现,对node的后置节点可以操作,直接越过其node.next连接到node.next.next,则完成对指定node的删除,结果如图4所示:
在这里插入图片描述
这里我们就完成了最少资源下指定一节点的删除功能思路分析。

步骤罗列

  1. node 的值与 node.next值相等;
  2. node.next连接到node.next.next

解题代码

    public static void solutionWithP(ListNode head, ListNode node) {
        node.val = node.next.val;
        node.next = node.next.next;
    }

复杂度分析

时间复杂度:这里我们并没有对链表进行遍历,而是直接在node为首节点的链表基础上直接进行操作,故为O(1);
空间复杂度:我们没有初始化或设置额外的辅助容器,所以这里空间复杂度为O(1);

GitHub代码

完整的可运行文件参见GitHub

发布了47 篇原创文章 · 获赞 55 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/u011106767/article/details/105261867