【发布时间】:2020-02-05 16:53:00
【问题描述】:
以下问题的答案是 O(n) 用于弹出,O(1) 用于推送。但我不太明白为什么 pop 不能是 O(1)。我们确实有指向链表末尾的尾指针,我们应该在 O(1) 时间内访问它,对吧?我错过了什么吗?
如果堆栈的底部必须位于链接内存结构的头部,push 和 pop 操作的运行时间是多少?其中 n 是结构中的节点数。
【问题讨论】:
标签: linked-list stack big-o singly-linked-list
以下问题的答案是 O(n) 用于弹出,O(1) 用于推送。但我不太明白为什么 pop 不能是 O(1)。我们确实有指向链表末尾的尾指针,我们应该在 O(1) 时间内访问它,对吧?我错过了什么吗?
如果堆栈的底部必须位于链接内存结构的头部,push 和 pop 操作的运行时间是多少?其中 n 是结构中的节点数。
【问题讨论】:
标签: linked-list stack big-o singly-linked-list
想想堆栈的不变量:tail 指向最后一个元素。
pop 操作删除了最后一个元素——这意味着我们需要重新调整tail。我们如何做到这一点?对于双向链表,我们可以只跟随指针回到前一个节点 - 但正如您的插图清楚地显示的那样,在单链表中没有这样的箭头返回到前一个节点。
所以我们需要从head(我们持有指针的唯一另一个节点)开始,一直迭代直到我们到达倒数第二个节点,然后将tail设置为指向那个节点。
【讨论】: