在线性时间内创建队列链接列表

时间:2019-02-12 20:19:02

标签: c time-complexity singly-linked-list

我想出了在C中创建链接列表的这种方式:

void queue(Node ** head, Node * object)
{
    Node * tmp = (Node *)malloc(sizeof(Node));
    *tmp = *object;
    Node *last = get_Last((*head));
    if (last) {
        last->next = tmp;
        tmp->next = NULL;
    }
    else {
        (*head) = tmp;
        tmp->next = NULL;
    }
}

这个想法很简单,将指向对象的指针传递到queue(...),然后遍历列表以找到最后一个节点,然后编辑一些指针。但是我不完全喜欢get_Last(...)函数:

Node * get_Last(Node * head)
{

    if (!head) {
        return NULL;
    }
    while (head->next) {
        head = head->next;
    }
    return head;
}

此函数意味着queue(...)应该在一个循环中发现自己,然后我想出的算法具有O(n²)时间复杂度,对于创建链接列表这样的简单操作来说,这太过复杂了。如何将复杂度降低到O(n)?我猜queue(...)仍然需要最后一个节点的地址,但是如何在没有循环的情况下获取它呢?

1 个答案:

答案 0 :(得分:1)

确定要在列表末尾插入项目吗? O(1)是免费的。{p}

如果实际上您想要一个有效的FIFO列表,到目前为止最好的方法是保留tail元素的地址。它只需要恒定的内存,并允许O(1)插入尾部。

最清晰的方法可能是制作一个Queue结构,该结构保留指向头尾的指针,实用程序函数接受指向Queue的指针进行入队和出队操作。