令P为单链表。令Q为指向列表中的中间节点x的指针。从列表中删除节点x的最著名算法的最坏情况下的时间复杂度是多少?
(A) O(n)
(B) O(log2 n)
(C) O(登录)
(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)
请参考此实现。
请注意,当要删除的节点是最后一个节点时,此方法不起作用。由于问题是中间节点,因此我们可以使用这种方法。这个问题的测验