O(1)的時間複雜度,刪除鏈表指定節點

/*
給出一個單鏈表的頭指針head和一節點指針toBeDeleted。O(1)時間複雜度刪除結點toBeDeleted
對於刪除節點,咱們普通的思路就是讓該結點的前一個節點指向改節點的下一個節點
這種狀況下須要遍歷找到該節點的前一個節點,時間複雜度爲O(n)。對於鏈表,鏈表的每一個節點的結構都是同樣的,全部咱們能夠把該節點的數據複製到該節點,而後刪除下一個節點便可,注意最後一個節點的狀況,這個狀況只能用常見的方法來操做,找到前一個節點,但整體的平均時間複雜度仍是O(1)
*/
public void delete(Node head, Node toDelete){
    if(toDelete == null){
        return ;
    }
    if(toDelete.next != null){
        toDelete.val = toDelete.next.val;
        toDelete.next = toDelete.next.next;
    }else{ //刪除的節點是尾節點的狀況
        Node node = head;
        while(node.next != toDelete){//找到倒數第二個節點
            node = node.next;
        }
        node.next = null;
    }
}
相關文章
相關標籤/搜索