[lintcode]-連結串列 在O(1)時間複雜度刪除連結串列節點
阿新 • • 發佈:2019-01-27
描述
給定一個單鏈表中的一個等待被刪除的節點(非表頭或表尾)。請在在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);
}
};