【发布时间】:2018-07-15 23:30:36
【问题描述】:
如何在 O(1) 中为 LinkedStack 编写 pop() 方法?
我的LinkedStack 类中有两个私有数据成员:ListNode* head 和ListNode* tail。
head 指向LinkedStack 的开头,tail 指向LinkedStack 的结尾。
pop() 将删除tail 指向的ListNode,然后tail 将指向之前 tail 的ListNode。
知道了这一点,我将如何在O(1) 中写入pop()?显然,我可以编写一个 for 循环,在 tail 之前抓取前一个 ListNode,但随后 pop() 不会是 O(1)。
由于这是家庭作业,我不是在寻找代码解决方案,只是可能是正确方向的提示。
编辑:我可能看到的一个解决方案是拥有一个ListNode* prev 数据成员,它始终指向tail 之前的前一个ListNode。但我觉得有一种更有效的方法....
Edit2:谢谢@user4581301。 假设LinkedStack为空时不会调用pop()。
【问题讨论】:
-
@user4581301 感谢您提及!假设链表为空时不会调用pop。
-
O(1) 解决方案(在这里做一些假设):
ListNode* temp = tail; tail = tail->prev; delete temp;如果您不能这样做,请重新考虑您的链表逻辑,因为某些内容已损坏或过于复杂。如果你想返回节点上的内容,你必须做更多的工作。请注意,标准库的堆栈不会从pop返回任何内容,以避免这种额外的工作以及随之而来的一些麻烦。 Link to related question that covers some of the nastiness. -
天哪。我很抱歉。我什至没有考虑单链表。是的,你试图用尾巴做的事情是不可能的,这可能是我的大脑过滤掉它并假设双向链表的原因。我应该阅读您的问题编辑。
标签: c++ linked-list stack big-o