LeetCode第237题:删除链表中的节点

0. 序言

学习数据结构之余,来LeetCode上刷刷简单的算法题,如果你对LeetCode刷题感兴趣,欢迎关注我。

1. 题目描述

请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。
现有一个链表 -- head = [4,5,1,9],它可以表示为:


3383952-a18f882d84a0e720.png
单链表

示例 1:

输入: head = [4,5,1,9], node = 5
输出: [4,1,9]
解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.

示例 2:

输入: head = [4,5,1,9], node = 1
输出: [4,5,9]
解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.

说明:

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

模板:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public void deleteNode(ListNode node) {
        
    }
}

2. 解决方案

  • 通常办法


    3383952-86bb6035347b3e70.png
    链表删除节点的通常办法

    链表删除节点的通常办法是找到要删除的节点的前一个节点,让它的next指针指向要删除的节点的下一个节点。如上图:要想删除3这个节点,只需要让2这个节点的next指针指向4即可。

  • 回归本题
    由于要求删除指定的节点,但是却未告知要删除的节点的前一个节点,所以这里我们可以把要删除节点的下一个节点的值赋给要删除的节点,然后把要删除的节点的next指针指向要删除的节点的下下个节点即可。


    3383952-86bb6035347b3e70.png
    1

    3383952-f4ec3f605b34e107.png
    2

    3383952-388b47e507e6bc4e.png
    3

    3383952-8ce155efc19100ac.png
    4

    如图1:想要删除指定节点3,可以把节点4的值赋给节点3,如图2,然后可以把节点3的next指针指向节点5,如图3,这样就相当于删除了节点3,结果如图4。
    因为要删除的节点不是末尾节点,所以这种办法可行。

3. 复杂度分析

时间和空间的复杂度都是O(1)

4. Java代码

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public void deleteNode(ListNode node) {
        node.val = node.next.val; ①
        node.next = node.next.next; ②
    }
}

ListNode定义了节点的内容,包括值val,next指针等。
代码①是把node节点的下一个节点的值赋给node节点,代码②是把node节点的next指针指向下下个节点。

5. 后续

如果大家喜欢这篇文章,欢迎点赞!
如果想看更多 LeetCode 方面的技术,欢迎关注!

猜你喜欢

转载自blog.csdn.net/weixin_34403693/article/details/87289850