[LintCode]372.在O(1)時間複雜度刪除連結串列節點
阿新 • • 發佈:2019-02-09
給定一個單鏈表中的一個等待被刪除的節點(非表頭或表尾)。請在在O(1)時間複雜度刪除該連結串列節點。
樣例 Linked list is1->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; } };