要移除链表元素,只需要改变要删除结点的前一个结点的next域,把它修改成要删除结点的next,即达到删除的目的。

为了操作方便,本方法还设置了头结点。它可以方便的删除结点,特别是开头那几个。

class Solution {
    public ListNode removeElements(ListNode head, int val) {
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        head = dummy;
        while(head != null && head.next != null){
            if(head.next.val == val){
                // 跳过这个元素,即删除它
                head.next = head.next.next;
            }else{
                // 不是要删除的元素,继续遍历
                head = head.next;
            }
        }
        return dummy.next;
    }
}

分享一个错误做法:
这是我一开始的做法,有、问题。

public ListNode removeElements(ListNode head, int val) {
        if(head == null || head.next == null){
            return head;
        }
        ListNode dummy = new ListNode(0);
        dummy.next = head; 
        while(head != null){
            if(head.val == val){
                if(head.next != null){
		    // 删除head指向的结点的元素
                    head.val = head.next.val;
                    head.next = head.next.next;
                }else{
                    // 到最后一个结点,并且是要删除的结点
                    head = null; // ?
                    break;
                }
            }else{ 
                head = head.next;
            }
        }
        return dummy.next;
    }

提到删除,有这么一道题237. 删除链表中的节点,参照思路,想着可以直接遍历所有的结点而不需要它们的前一个结点,即直接遍历所有结点
while(head != null){ 进行操作... }
但最后会发现,没法用这方法来删除最后一个元素。

我当时想的是,万一head遍历到最后一个元素而且最后一个元素刚好是要删除的元素,直接让它变为Null就行了。

head = null; break;
确定是把该结点的内容变成null了吗?$X$

其实我只是改变了head指针的指向,它从原来指向要删除的结点变成了指向null……
所以并没有删除元素。