203. 移除链表元素

删除链表中等于给定值 val 的所有节点。
示例:
输入: 1->2->6->3->4->5->6, val = 6
输出: 1->2->3->4->5


方法一:

/**
 * 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 cur=head;
        ListNode pre=null;
        while(cur!=null){
            if(cur.val==val&&pre==null){
                //如果找到相等值,要判断cur是不是头节点(根据pre==null来判断),如果为空说明还没遇到不相等的冲点null值,此时删除cur,并且head节点向后移动。
                cur=cur.next;
                head=cur;
            }else if(cur.val==val&&pre!=null){
                //pre不等于null,说明删除的前节点有值,直接把cur指向他的下下个节点。同时cur移动到下一个节点
                pre.next=cur.next;
                cur=pre.next;
            }else{
                //值不相等,pre、cur同时后移即可
                pre=cur;
                cur=cur.next;
            }
        }
        return head;
    }
}

方法二:用个虚拟前节点,不用考虑pre是否为null的情况

class Solution {
    public ListNode removeElements(ListNode head, int val) {
        //创建一个虚拟头结点
        ListNode dummyNode=new ListNode(val-1);
        dummyNode.next=head;
        ListNode prev=dummyNode;
        //确保当前结点后还有结点
        while(prev.next!=null){
            if(prev.next.val==val){
                prev.next=prev.next.next;
            }else{
                prev=prev.next;
            }
        }
        return dummyNode.next;
    }
}

方法三:递归

class Solution {
    public ListNode removeElements(ListNode head, int val) {
        if(head==null){
           return null;
       }
        head.next=removeElements(head.next,val);
        if(head.val==val){
            return  head.next;
        }else{
            return head;
        }
    }
}

lsq_2019
17 声望0 粉丝