剑指 Offer 18. 删除链表的节点
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。
返回删除后的链表的头节点。
输入: head = [4,5,1,9], val = 1
输出: [4,5,9]
解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shan-chu-lian-biao-de-jie-dian-lcof
对于链表的删除 我们需要知道删除链表的节点只能在要删除节点的前一个节点做删除操作,如果在要删除的节点本身做操作是无法进行删除的,明确了这一点很容易就可以做出这道题;
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode deleteNode(ListNode head, int val) {
if(head==null){
return null;
}
//如果头结点就是要删除的节点
if(head.val==val){
//直接返回当前节点的下一个节点即可
return head.next;
}
//定义一个指针结点 指向原来的头结点
ListNode node=head;
//如果这个指针指向的值不为空 就一直循环
while(node!=null){
//保存当前节点的下一个节点的值
//因为我们链表的删除只能在要删除的节点的前一个节点做动作
//如果指针指向了要删除的节点我们是无法做删除操作的
ListNode temp=node.next;
//判断 如果的当前节点的下一个节点不为空且下一个节点就是要删除的节点
if(temp!=null&&temp.val==val){
//我们直接做删除操作
//把当前的节点的下一个指针指向下一个节点指针指向的下一个节点
node.next=temp.next;
}
//这里是如果没有找到要删除的节点我们指针后移 向链表的后序节点移动
node=node.next;
}
//删除完成返回头节点即可
return head;
}
}