劍指Offer:面試題13——在O(1)時間刪除鏈表結點

問題描述:

給定單向鏈表的頭指針和一個結點指針,定義一個函數在O(1)時間刪除該結點。鏈表結點與函數的定義如下:

public class ListNode{
    int value;
    ListNode next;
    public ListNode(int v){value = v;}
}

思路:常規的做法就是遍歷鏈表找到被刪除結點的前趨p,然後改變p->next的指向即可。但是這種做法的時間複雜度爲O(n)。

因此我們要另尋他路。現在我們已知了要刪除的結點指針,那麼我們很容易獲得它的後繼,那麼顯然我們,我們可以直接將其後繼內容放在該結點上,然後刪除後繼結點即可

public void deleteNode(ListNode head, ListNode pToBeDeleted){
    if(head == null || pToBeDeleted == null){
        return;
    }
    ListNode q = pToBeDeleted->next;
    //要刪除的不是尾結點
    if(q != null){
        pToBeDeleted->value = q -> value;
        pToBeDelted->next = q->next;
        q = null;
    }
    //鏈表只有一個結點,刪除頭結點(也是尾節點)
    else if(head == pTobeDeleted){
        pToBeDeleted = null;
        head = null;
    }else{//鏈表中有多個結點,刪除尾結點
        ListNode q = head;
        while(q -> next != pToBeDeleted){
            q = q -> next;
        }
        q -> next = null;
        pToBeDeleted = null;
    }
}

上述代碼基於一個假設:要刪除的結點的確在鏈表中。

發佈了62 篇原創文章 · 獲贊 44 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章