力扣-203-移除链表元素

方法一、不优化,特例判断

package LeetCode;
/**返回链表的中间结点,如果有两个中间节点,则返回第二个**/
//双指针法:fast和slow,slow每次走一个单位,fast每次走两个单位
public class day10 {
    //情况1:这个代码有点复杂,存在删除头节点和尾节点两种情况
    public ListNode removeElements1(ListNode head, int val) {
        if(head == null) return null;

        while(head.val == val){ //特例  [1,1,1,1] -> [],针对于开头一连串的val
            if(head.next == null) return null;
            else head = head.next;
        }
        ListNode prev = head;
        ListNode node = head.next;
        while(node != null) {
            if(node.val == val) {
                prev.next = node.next;
            }else{
                prev = node;
            }
            node = node.next;
        }
        return head;
    }
}
package LeetCode;
/**返回链表的中间结点,如果有两个中间节点,则返回第二个**/
//双指针法:fast和slow,slow每次走一个单位,fast每次走两个单位
public class day10 {
 

    //情况2:优化,增加哨兵节点。使链表永不为空、永不无头、简化插入和删除
    public ListNode removeElements2(ListNode head, int val) {
        ListNode sentinelNode = new ListNode(0);
        sentinelNode.next = head;
        ListNode prev = sentinelNode, curr = head;

        while(curr != null) {
            if(curr.val == val) prev.next = curr.next;
            else prev = curr;
            curr = curr.next;
        }
        return sentinelNode.next;
    }


    public static void main(String[] args) {
        //test()
    }
}

方法二、利用哨兵节点,进行特例判断

posted @ 2020-12-24 22:22  Peterxiazhen  阅读(96)  评论(0编辑  收藏  举报