算法修炼之路——【链表】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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值