1. 程式人生 > >如何在O(1)時間刪除連結串列指定節點(Java實現)

如何在O(1)時間刪除連結串列指定節點(Java實現)

宣告:題目背景為劍指offer-13 在O(1)時間刪除連結串列節點
給出一個連結串列如下:
這裡寫圖片描述
刪除連結串列中給定節點,我想最容易想到的方法就是迴圈遍歷,假設想刪除節點toBeDeleted,我們先遍歷連結串列,找到節點的下一節點為toBeDeleted的節點,將其指向toBeDeleted節點的下一節點即可保證安全的刪除連結串列且無斷開。示意圖如下:
這裡寫圖片描述
但是這種方法的複雜度O(n),在O(1)時間刪除指定節點,書中指出將下一個節點的內容複製到需要刪除的節點上面覆蓋原有內容,再刪除下一個節點即相當於刪除了原節點,如下圖:
這裡寫圖片描述
這裡需要注意考慮以下幾種情況:
1.連結串列和待刪除節點均不為空
2.連結串列中只有一個節點時
3.待刪除節點為尾節點時
4.連結串列中多個點,待刪除節點不為尾節點
帥氣的方法,所以自己也用Java實現了一下。方法實現程式碼如下:

/**
 * 在O(1)時間內刪除指定節點,思路:找到指定節點的下一節點,覆蓋指定節點
     * 考慮:1.連結串列和待刪除節點均不為空
     *      2.連結串列中只有一個節點時-->頭結點等於尾節點
     *      3.待刪除節點為尾節點時-->待刪除節點不存在下一個節點-->
     *        只有迴圈遍歷
     *      4.連結串列中多個點,待刪除節點不為尾節點
     * @param listNode
     * @param toBeDeleted
     */
    public void deleteNode
(ListNode listNode, ListNode toBeDeleted){ //輸入的連結串列及待刪節點不能為空 if(listNode == null || toBeDeleted == null) return; if(listNode == toBeDeleted){ listNode = null; }else if(toBeDeleted.next != null){ ListNode nextNode = toBeDeleted.next; toBeDeleted.val = nextNode.val; toBeDeleted.next = nextNode.next; }else
{ while(listNode.next != toBeDeleted){ listNode = listNode.next; } listNode.next = null; } }