LeetCode 图解 | 237. 删除链表中的节点(附有知识点回顾)

题目描述

有一个单链表的 head,我们想删除它其中的一个节点 node。

给你一个需要删除的节点 node 。你将 无法访问 第一个节点 head。

链表的所有值都是 唯一的,并且保证给定的节点 node 不是链表中的最后一个节点。

删除给定的节点。注意,删除节点并不是指从内存中删除它。这里的意思是:

  • 给定节点的值不应该存在于链表中。
  • 链表中的节点数应该减少 1。
  • node 前面的所有值顺序相同。
  • node 后面的所有值顺序相同。

自定义测试:

  • 对于输入,你应该提供整个链表 head 和要给出的节点 node。node 不应该是链表的最后一个节点,而应该是链表中的一个实际节点。
  • 我们将构建链表,并将节点传递给你的函数。
  • 输出将是调用你函数后的整个链表。

在这里插入图片描述

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;//节点值
 *     ListNode next;//获取下一个节点
 *     ListNode(int x) { val = x; }//有参构造函数
 * }
 */
class Solution {
    public void deleteNode(ListNode node) {
        
    }
}

思路分析

问题源

从上面分析可知,此题注意的点是没有给我们链表的起点,只给我们了一个要删的节点。而我们所学的是获取链表的下标值index来删除元素的,也就是可以找出要删除元素的前一个节点,前一个节点的next指向新的节点对象,新的next指向 下一个节点对象
在这里插入图片描述
这样的话,就无法按照以前的删除思路来操作,那怎么整呢?

解决方案

在链表 [4, 5, 1, 9] 中,当我们要删除节点 5 时,我们会修改节点 5 上一个节点 4 的指针,让它指向节点 5 的下一个节点,即节点 1:

在这里插入图片描述
因为要删除给定的节点,而我们还不清楚这个节点的前一个节点,我们只能确定这个节点的下一个节点,想要删除这个节点,我们就需要找到可以知道上一个节点的节点,把它变成要删除的节点,然后删除它。

例如,还是链表 [4, 5, 1, 9] 链表,还是删除节点 5 。

首先我们先把节点 5 的下一个节点赋值给它,把它变成一个不需要删除的节点。

在这里插入图片描述
这样来看,我们无论删除第二个节点还是删除第三节点,得到的链表都是 [4, 1, 9]。既然第二个节点不好删除,那么我们就删除第三个节点。

将第二个节点的指针指向第四个节点,这样我们就删除第三个节点了。如下:

在这里插入图片描述

具体实现

/**
 * @Author: 爱摸鱼的TT~
 * @Description: https://leetcode.cn/problems/delete-node-in-a-linked-list/
 * @Date Created in 2022-11-20 13:09
 * @Modified By:
 */
public class _237_删除链表中的节点 {

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

    // 节点内部类
    public class ListNode {
         int val; // 元素值
         ListNode next; // 下一个节点对象
         ListNode(int x) {
             val = x;
         }
    }
}

在这里插入图片描述

知识点回顾

《恋上数据结构与算法》第1季:链表原理实现(图文并茂)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

涛涛同学debug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值