1. 程式人生 > >[LintCode]372.在O(1)時間複雜度刪除連結串列節點

[LintCode]372.在O(1)時間複雜度刪除連結串列節點

給定一個單鏈表中的一個等待被刪除的節點(非表頭或表尾)。請在在O(1)時間複雜度刪除該連結串列節點。

樣例  Linked list is 1->2->3->4, and given node 3, delete the node in place 1->2->4 思路:關於單鏈表的刪除,通常先從連結串列的頭節點開始順序找到被刪節點的前驅節點,然後再刪除節點主要時間耗費在查詢操作上,時間複雜度為O(n); 其實,也可以通過刪除節點的後繼節點來實現,實質就是將其後繼節點的值賦予自身,然後刪除後繼節點,使得時間複雜度為O(1)。
/**
 * Definition of ListNode
 * class ListNode {
 * public:
 *     int val;
 *     ListNode *next;
 *     ListNode(int val) {
 *         this->val = val;
 *         this->next = NULL;
 *     }
 * }
 */
class Solution {
public:
    /**
     * @param node: a node in the list should be deleted
     * @return: nothing
     */
    void deleteNode(ListNode *node) {
        ListNode *p=node->next;
        node->val=node->next->val;
        node->next=p->next;
        delete p;
    }
};