1. 程式人生 > >劍指offer之O(1)刪除單鏈表節點

劍指offer之O(1)刪除單鏈表節點

1.單向連結串列刪除指定節點

  • 常規思路:從頭遍歷到指定節點前一個節點Pre,然後將Pre的next指向指定節點的下一個,刪除指定節點即可。O(n)

  • 將指定節點下一個的內容複製到指定節點,然後刪除其下一個節點。O(1)

2.程式碼

void deleteNode(ListNode **head, ListNode *toDelete)
{
    if(!head || !toDelete)
        return;

    if(toDelete->next != null)//非尾節點
    {
        ListNode* next = toDelete->next;
        toDelete->value = next->value;
        toDelete->next = next->next;

        delete next;
        next = NULL;
    }else if(*head == toDelete)//尾節點,但整個連結串列只有一個節點
    {
        delete toDelete;
        toDelete = NULL:
        *head = NULL;
    }else//尾節點,連結串列有多個節點
    {
        ListNode* node = *head;
        while(node->next != toDelete)
        {
            node = node->next;
        }
        node-next = NULL;
        delete toDelete;
        toDelete = NULL;
    }
}

3.複雜度

  • 僅當連結串列有多個節點,刪除尾節點時,需要遍歷,時間複雜度O(n)

  • 非尾節點或者尾節點就是頭節點,都是O(1)

  • 平均複雜度還是O(1)

  • 由於受到O(1)複雜度限制,程式碼不能檢測toDelete是否在連結串列中,只能假設輸入無誤