设 P 是一个单链表。令 Q 为指向列表中中间节点 x 的指针。从列表中删除节点 x 的最著名算法的最坏情况时间复杂度是多少?
(A) O(n)
(B) O(log2 n)
(C) O(logn)
(D) O(1)答案: (D)
解释:一个简单的解决方法是遍历链表,直到找到要删除的节点。但是这个解决方案需要指向与问题陈述相矛盾的头节点。
快速的解决方案是将数据从下一个节点复制到要删除的节点并删除下一个节点。像下面这样的东西。
// Find next node using next pointer
struct node *temp = node_ptr->next;
// Copy data of next node to this node
node_ptr->data = temp->data;
// Unlink next node
node_ptr->next = temp->next;
// Delete next node
free(temp);
这种方法的时间复杂度是 O(1)
参考这个实现。
请注意,当要删除的节点是最后一个节点时,此方法不起作用。由于问题说的是中间节点,我们可以使用这种方法。这个问题的测验