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

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

描述

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

樣例

Linked list is 1->2->3->4, and given node 3, delete the node in place 1->2->4

思路

需要在O(1)複雜度內刪除該節點,已知結點node,普通情況下刪除結點需要遍歷整個連結串列,找到其前驅,才能刪除結點,但複雜度為o(n), 所以不能用這種方法。我們可以刪除該節點的後繼,將此結點的後繼的值賦給該結點,再將後繼結點刪除,即可。

程式碼

/**
 * 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) { if (node == NULL) { return; } ListNode *tmp = node->next; node->val = node->next->val
; node->next = tmp->next; free(tmp); } };