题目描述
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。
返回删除后的链表的头节点。
示例 1:
输入: head = [4,5,1,9], val = 5 输出: [4,1,9] 解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
示例 2:
输入: head = [4,5,1,9], val = 1 输出: [4,5,9] 解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.
题目分析
双指针解决这类问题
解法
- 定义后驱节点pre 和前驱节点cur,最初都指向链表头部head
- 前驱节点cur来判断当前节点值是否为目标值,若为目标值,则让后驱节点指向cur的next,同时将cur指针向前推进;否则,后驱节点指向cur,同时将cur指针向前推进;【此时需要对首节点为目标值的情况进行特殊处理】
- 返回head
class Solution {
public ListNode deleteNode(ListNode head, int val) {
if(head.val==val){
head=head.next;
}
ListNode pre=head;
ListNode cur=head;
while(cur!=null){
if(cur.val==val){
pre.next=cur.next;
}else{
pre=cur;
}
cur=cur.next;
}
return head;
}
}