[lintcode]-链表 在O(1)时间复杂度删除链表节点

来源:互联网 发布:网络语call是什么意思 编辑:程序博客网 时间:2024/05/17 20:33

描述

给定一个单链表中的一个等待被删除的节点(非表头或表尾)。请在在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);    }};
原创粉丝点击