Leetcode 203. Remove Linked List Elements

GoodJobJasper發表於2020-12-27

在這裡插入圖片描述
方法1: iterate。這題主要是要設定一個prev node,然後還要設定一個哨兵node,就這個比較煩,因為遍歷的時候會修改原來的list導致最後不知道返回什麼了(我經常做到最後不知道要返回什麼)。時間複雜n,空間複雜1.

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode removeElements(ListNode head, int val) {
        ListNode curr = head;
        ListNode sentinel = new ListNode(0);
        sentinel.next = head;
        
        ListNode prev = sentinel;
        while(curr != null){
            if(curr.val == val){
                prev.next = curr.next;  
            }else{
                prev = prev.next;
            }
            curr = curr.next;
        }
        return sentinel.next;
    }
}

方法2: recursion。直接上程式碼,非常簡單易懂。時間n,空間1.

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode removeElements(ListNode head, int val) {
        if (head == null) return null;
        head.next = removeElements(head.next, val);
        return head.val == val ? head.next : head;
    }
}

總結:

  • 感覺遇到連結串列題我一般都會先想到iterate,卻沒有花多少精力在recursion上,其實recursion也是做連結串列題的很好的方法。

相關文章