JZ-069-在 O(1) 時間內刪除連結串列節點

雄獅虎豹發表於2022-03-01

在 O(1) 時間內刪除連結串列節點

題目描述

在 O(1) 時間內刪除連結串列節點。

方案:如果該節點不是尾節點,那麼可以直接將下一個節點的值賦給該節點,然後令該節點指向下下個節點,再刪除下一個節點,時間複雜度為 O(1)。否則,就需要先遍歷連結串列,找到節點的前一個節點,然後讓前一個節點指向 null,時間複雜度為 O(N)。

題目連結: [在 O(1) 時間內刪除連結串列節點]()

程式碼

/**
 * 在 O(1) 時間內刪除連結串列節點
 */
public class Jz69 {

    /**
     * 方案:
     * 如果該節點不是尾節點,那麼可以直接將下一個節點的值賦給該節點,然後令該節點指向下下個節點,再刪除下一個節點,時間複雜度為 O(1)。
     * 否則,就需要先遍歷連結串列,找到節點的前一個節點,然後讓前一個節點指向 null,時間複雜度為 O(N)。
     *
     * @param head
     * @param tobeDelete
     * @return
     */
    public ListNode deleteNode(ListNode head, ListNode tobeDelete) {
        if (head == null || tobeDelete == null) {
            return null;
        }
        if (tobeDelete.next != null) {
            // 要刪除的節點不是尾結點
            ListNode next = tobeDelete.next;
            tobeDelete.val = next.val;
            tobeDelete.next = next.next;
        } else {
            if (head == tobeDelete) {
                // 只有一個節點
                head = null;
            } else {
                ListNode cur = head;
                while (cur.next != tobeDelete) {
                    cur = cur.next;
                }
                cur.next = null;
            }
        }

        return head;
    }

    public static void main(String[] args) {
    
    }
}
【每日寄語】 竇燕山,有義方;教五子,名俱揚。

相關文章