为什么AddAfter()具有固定时间?

时间:2018-09-18 17:30:41

标签: data-structures linked-list

在链表操作中,Addbefore(node,key)具有线性时间,即O(n),但是AddAfter(node,key)具有恒定的时间,即O(1)。谁能说出原因?

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);
}

对于双向链接列表,这不是必需的,因为每个节点都有指向其前任及其后任的指针。

吉姆