写法1、头节点 和 后面的节点 删除规则不一致
class Solution {public ListNode removeElements(ListNode head, int val) {//如果不建虚拟头节点,那删头节点和删后面的节点,逻辑是不一样的//头节点可能连续多个命中val,所以有while,不是ifwhile(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;}
}