本题中,我们是要移除链表的某一个节点,为了确保统一操作,我们需要使用虚拟头节点,这样我们删除节点的时候,就是把这个要删除的节点(当前节点cur)的前一个节点pre,使得pre.next指向要删除节点的下一个节点,所以就是pre.next = cur.next。
如果不是我们要删除的节点,那我们就移动pre指针,让其往后走,就是pre=cur。然后再切换当前节点的位置,cur = cur.next。
public ListNode removeElements(ListNode head, int val) {
if (head == null) {
return head;
}
// 因为删除可能涉及到头节点,所以设置dummy节点,统一操作
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;//也可以写成pre=pre.next
}
cur = cur.next;
}
return dummy.next;
}