移除链表元素 【Java-力扣】

删除链表中等于给定值 val 的所有节点。

示例:

输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5

分析:
要像实现删除指定内容项,可以将删除项的prev.next改为删除项的下一项的引用。链表问题画图解决比较容易,整体逻辑如下图所示:
移除链表元素 【Java-力扣】_第1张图片
要注意的是,
1、判断prev.next.val与val是否相等的操作必须在cur != null的前提下进行,因为不管是否相等,接下来都会用到cur.next,其必须在cur不为空的时候才合法。

2、如果head == null,即链表本身即为空,不必进行后续操作,直接返回。

3、当将整个链表都遍历一遍后,需要对head部分进行判断,因为一开始定义prev和cur的时候并没有对其进行判断。而且这一步必须放在遍历一遍数组之后,若是开头进行

if(head.val == val) {
     
    head = head.next;
}

当链表的第二项仍需要删除时,即使head向后移一位,得到的head仍然要删除。


完整代码如下:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
     
    public ListNode removeElements(ListNode head, int val) {
     
        if(head == null) {
     
            return null;
        }
        ListNode prev = head;
        ListNode cur = head.next;
        while(cur != null) {
     
            if(prev.next.val == val) {
     
                prev.next = cur.next;
                cur = cur.next;
            }else {
     
                prev = cur;
                cur = cur.next;
            }
        }
        //必须在最后一步判断头部的删除
        if(head.val == val) {
     
            head = head.next;
        }
        return head;
    }
}

你可能感兴趣的:(力扣)