使用链接列表实现的堆栈ADT的时间复杂度

时间:2011-06-30 15:22:20

标签: pointers data-structures stack time-complexity abstract-data-type

使用LinkedList实现的Stack抽象数据类型的put(x)和get()函数的时间复杂度是什么?

我的第一个想法是他们都是O(1)。但是如果get()必须从头节点遍历到列表中的最后一个元素以找到要删除和返回的元素,则get()函数将为O(n)。

put(x)函数也必须遍历整个列表以找到最后一个节点,它将安装一个新节点。所以这也是O(n)。

如果使用LinkedList的“专用”版本,一个始终保持指向列表中最后一个节点的指针,则这两个版本都将成为常量时间操作。我是否正确理解LinkedList的标准实现不具备此功能?

3 个答案:

答案 0 :(得分:7)

您不必在列表末尾插入。如果您插入(单链接)列表的前面,它们都是O(1)

Stack包含1,2,3:

[1]->[2]->[3]

按5:

[5]->[1]->[2]->[3]

流行:

[1]->[2]->[3], returning 5

答案 1 :(得分:1)

对于双向链表,堆栈操作push和pop应该都是O(1)。

如果您遇到单链表,假设您可以保持指向尾部和头部的指针,那么您可以进行入队和出队的O(1)队列操作。并且因为通过分摊的常量开销,您可以从两个队列中创建一个堆栈,最后,您可以实现O(1)推送和弹出。

答案 2 :(得分:0)

堆栈的基本功能是从堆栈的顶部(即链表的开头)执行推入和弹出操作。实现链接列表时,将保留指向该列表中第一个元素的头指针,因此用于从堆栈中添加/删除元素的put(x)和get()操作始终为O(1)。