在链表操作中,Addbefore(node,key)具有线性时间,即O(n),但是AddAfter(node,key)具有恒定的时间,即O(1)。谁能说出原因?
答案 0 :(得分:1)
说明单链列表的组织方式:
A->B->C->D
现在,假设您想在B之后添加一个节点。您可以直接访问该节点并访问其next
指针以链接到新节点。因此,如果您创建一个新节点,并使用传递的密钥将其命名为X,则可以执行以下操作:
Copy B's next pointer to X // B and X both point to C
Set B's next pointer to X // B points to X and X points to C
AddAfter(node,key)
{
newNode = CreateNewNode(key);
newNode.next = node.next;
node.next = newNode;
}
但是,如果您想在之前添加,那么您不知道哪个节点在之前B。因此,您必须扫描列表以找出:
AddBefore(node, key)
{
parent = head;
// find the node that points to the passed node
while (parent.next != node)
{
parent = parent.next;
}
// Then add the new node after parent
AddAfter(parent, key);
}
对于双向链接列表,这不是必需的,因为每个节点都有指向其前任及其后任的指针。
吉姆