假设我有一个带有哨兵的单链表。要在O(1)时间内删除最后一个元素,我需要保持句柄以持续2个元素。但是将句柄保持为最后两个元素会使添加操作复杂化。
有没有办法在O(1)中使用sentinel删除单链表的最后一个元素而不保留最后2个元素的句柄?我非常感谢java中的任何示例代码。
感谢。
答案 0 :(得分:3)
以正常方式实施的单链表将是O(N)
操作。
保留最后一个元素的句柄并不复杂,单链接列表实现通常会这样做,以便您可以在O(1)
的末尾添加。但是,无法保持指向O(1)
“删除最后一次”操作的最后一个元素的链接。
想一想。假设我有一个地方可以保持指向最后一个节点和倒数第二个节点的指针。当我删除最后一个节点时,我需要:
next
指针更新为null,last
指针以指向倒数第二个节点。secondToLast
指针以指向它之前的节点。但是如何在不从头开始遍历列表的情况下完成最后一步...这是O(N)
操作?
现在我想您可以编写链接列表代码,以便在第一次执行时删除最后一个元素O(1)
,并在后续时间删除O(N)
...直到你在最后添加一个新元素。但除非你有一个不寻常的用例,否则这种“优化”将不值得。
您可能最好使用java.util.LinkedList
使用双向链接列表,并且removeLast()
方法为O(1)
。“
答案 1 :(得分:2)
不,从末尾删除仅适用于双向链接列表。 您需要后向指针将新的NULL终止符放在上一个链接上。我建议将列表双重链接以满足您的要求。
你在制作自己的容器吗?为什么不使用双重链接的java.util.LinkedList?