从列表中删除范围(尾部)
问题内容:
是否有删除范围的有效方法-说的尾巴-从X的元素List
,如LinkedList
在Java中?
显然有可能一个接一个地删除最后一个元素,这将导致O(X)级性能。至少在LinkedList
某些情况下,应该具有O(1)性能(通过在要删除的第一个元素周围设置参考并设置头/尾参考)。不幸的是,我看不到任何方法List
或LinkedList
一次全部删除最后一个元素。
目前,我正在考虑通过使用 替换
列表,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
节点的指针。