乐趣区

LeetCode之203-移除链表元素

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;}
    }
}
退出移动版