题目描述
有一个单链表的 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;
}
}
}