我想出了在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(...)
仍然需要最后一个节点的地址,但是如何在没有循环的情况下获取它呢?
答案 0 :(得分:1)
确定要在列表末尾插入项目吗? O(1)
是免费的。{p}
如果实际上您想要一个有效的FIFO列表,到目前为止最好的方法是保留tail元素的地址。它只需要恒定的内存,并允许O(1)
插入尾部。
最清晰的方法可能是制作一个Queue结构,该结构保留指向头尾的指针,实用程序函数接受指向Queue的指针进行入队和出队操作。