题目
要求:给你链表头结点 head 和整数 val,删除链表中所有 Node.val == val 的节点,返回删除后的新头结点。

输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]
示例 2:
输入:head = [], val = 1
输出:[]
示例 3:
输入:head = [7,7,7,7], val = 7
输出:[]
思路
哑结点 dummy + 前驱指针 prev

-
当
cur.val == val时(需要删除):prev.next = cur.next:让prev跳过cur,直接指向cur的下一个节点cur = cur.next:cur移动到下一个节点(注意此时prev不动)
-
当
cur.val != val时(保留):-
prev = cur:prev向前移动到cur的位置 -
cur = cur.next:cur向前移动
-
哑结点 dummy简介
哑结点(dummy/sentinel)就是在真正链表头前面,人为加一个"永远不删/不参与数据"的节点 ,它的 next 指向原来的 head。
为什么要用它 :统一删除逻辑 。不管你删的是头结点、中间结点还是尾结点,都变成用前驱节点 prev 去改指针:prev.next = cur.next,不需要专门处理删头结点这种特例。
code
java
class Solution {
public ListNode removeElements(ListNode head, int val) {
ListNode dummy = new ListNode(0, head);
ListNode prev = dummy, cur = head;
while(cur!=null){
//删除
if(cur.val==val){
prev.next=cur.next;
cur=cur.next;
}else{
prev=cur;
cur=cur.next;
}
}
return dummy.next;
}
}