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