从列表中删除范围(尾部)


问题内容

是否有删除范围的有效方法-说的尾巴-从X的元素List,如LinkedList在Java中?

显然有可能一个接一个地删除最后一个元素,这将导致O(X)级性能。至少在LinkedList某些情况下,应该具有O(1)性能(通过在要删除的第一个元素周围设置参考并设置头/尾参考)。不幸的是,我看不到任何方法ListLinkedList一次全部删除最后一个元素。

目前,我正在考虑通过使用 替换
列表,List.subList()但是不确定是否具有相同的性能。至少在代码中它会更清楚,另一方面,我会松散LinkedList提供的其他功能。

我主要使用List作为堆栈,这LinkedList似乎是最好的选择,至少在语义方面。


问题答案:

subList(list.size() - N, list.size()).clear()是删除最后一个N元素的推荐方法。实际上,Javadoc
subList

特别 推荐以下惯用法:

此方法消除了对显式范围操作(数组通常存在的那种范围)的需要。通过传递subList视图而不是整个列表,可以将期望列表的任何操作用作范围操作。例如,以下成语从列表中删除了一系列元素:

 list.subList(from, to).clear();

确实,我怀疑这个惯用法可能比调用时间 有效(尽管有一个固定的因素)removeLast()
N,只是因为一旦找到了N倒数第二个节点,它只需要更新链表中恒定数量的指针,而不是一次更新每个最后一个N节点的指针。