原题链接
思路:使用虚拟头节点
- 首先判断是否为空,若为空则直接返回head
- 定义一个dummy,定义pre节点指向dummy,cur节点指向head
- 当cur非null时,开始判断cur的val是否是要删除的val
- 若是则 执行 pre.next = cur.next; 含义是让pre指向cur的指向 代表将本节点跳过
- 若不是,则将cur节点直接赋值给pre节点
- 之后将cur指向下一个位置 cur = cur.next;
- 二刷:注意返回的时候,返回的是虚拟结点的next,即 return dummy.next
- 记不住思路,多回顾
class Solution {
public ListNode removeElements(ListNode head, int val) {
if(head == null) return head;
ListNode dummy = new ListNode(-1, head);
ListNode pre = dummy;
ListNode cur = head;
while(cur != null){
if(cur.val == val){
pre.next = cur.next;
}else{
pre = cur;
}
cur = cur.next;
}
//注意返回值
return dummy.next;
}
}