写法1、头节点 和 后面的节点 删除规则不一致
class Solution {
public ListNode removeElements(ListNode head, int val) {
//如果不建虚拟头节点,那删头节点和删后面的节点,逻辑是不一样的
//头节点可能连续多个命中val,所以有while,不是if
while(head!=null && head.val == val){
head=head.next;
}
ListNode cur = head;
//上面head可能全部删完了,所以要判断,cur不为null,我们下面需要取cur.next的val,所以还要判断cur.next不为null,
while(cur!=null&&cur.next!=null){
if(cur.next.val == val){
//相等就跳过中间的一个节点
cur.next = cur.next.next;
}else{
//不相等就往后走
cur = cur.next;
}
}
return head;
}
}
写法2、新建虚拟指针法:使得删除规则可以一致
class Solution {
public ListNode removeElements(ListNode head, int val) {
//新建一个虚拟头节点,让算法规则统一
ListNode xuniHead = new ListNode();
xuniHead.next = head;
//当前节点cur必须指向虚拟头节点 而不是head,因为我们算法统一后是没办法删除cur本身节点的,算法只能删除cur.next及之后的(也就是head及之后的)
ListNode cur = xuniHead;
while(cur.next!=null){
if(cur.next.val == val){
//相等就跳过中间的一个节点
cur.next = cur.next.next;
}else{
//不相等就往后走
cur = cur.next;
}
}
return xuniHead.next;
}
}