铭记:
源码下载
一、237.删除链表中的节点
请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点。传入函数的唯一参数为 要被删除的节点 。
一个链表 -- head = [4,5,1,9]
输入:head = [4,5,1,9], node = 5
输出:[4,1,9]
解释:给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
思路:4->5->1->9->NULL
思路1:在单链表中要删除一个节点,第一反应应该是拿到要删除的节点B,找到节点B的上一个节点A,找到节点B的下一个节点C,然后直接让节点A的next指向C就可以完成删除节点B。问题就出现在这是一个单向链表,知道节点B却无法拿到节点A。
思路2:上面的思路是要把整个节点删除,但是行不通;但是可以改造一下,即:用节点C中的值代替节点B中的值,而让节点B的next指向节点C的next,最后将节点C的next指向NULL,这样就把节点B改造成了节点C,看似删除了节点B,实质是删除了节点C
-
1、用节点C中的值代替节点B中的值
-
2、节点B的next指向节点C的next
-
3、节点C的next指向NULL
-
4、看似删除了节点B,实质是删除了节点C
代码
ListNode
public class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
deleteNode方法
/**
* https://leetcode-cn.com/problems/delete-node-in-a-linked-list/
*
* 请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点。传入函数的唯一参数为 要被删除的节点 。
* 现有一个链表 -- head = [4,5,1,9],它可以表示为:
*
*/
public class _237_删除链表中的节点 {
public void deleteNode(ListNode node) {
// 让下一个节点的值覆盖当前节点的值
node.val = node.next.val;
// 让当前节点的next 指向 下一个节点的next
node.next = node.next.next;
}
}