链表定义:
链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。
链接的入口节点称为链表的头结点也就是head。
java版本链表定义:
public class ListNode{
int val;
ListNode next;
ListNode() {}
ListNode(int val) { this.val = val; }
ListNode(int val) { this.val = val; this.next = next; }
}
1、为什么要创建虚拟头结点:
如果不创建虚拟头结点:
除头结点外其他结点cur,满足cur.val == val条件时执行操作:
pre.next = cur.next;
cur = cur.next;
但是头结点head!=null && head.val == val时,要将头结点移除时,只需要执行head = head.next。
可以看到两者的操作不一致,头结点需要单独判断。
如果我们设置虚拟头结点,便不需要对头结点进行判断。注意:返回虚拟头结点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;
}
}