X要素の範囲(末尾など)をList
から削除する効率的な方法はありますか。 LinkedList
Javaで?
最後の要素を1つずつ削除することは明らかに可能です。これにより、O(X)レベルのパフォーマンスが得られます。少なくともLinkedList
インスタンスの場合、= O(1)パフォーマンス(削除する最初の要素の周りの参照を設定し、ヘッド/テールの参照を設定することにより)。残念ながら、List
内にはメソッドがありませんLinkedList
は、最後の要素を一度にすべて削除します。
現在、私は List.subList()
を使用してリストを置換することを考えていますが、それがわからない同等のパフォーマンスがあります。少なくともコード内ではより明確になりますが、一方でLinkedList
が提供する追加機能を失うことになります。
私は主にListをスタックとして使用していますが、少なくともセマンティクスに関してはLinkedList
が最良のオプションのようです。
subList(list.size() - N, list.size()).clear()
は、最後のN
要素を削除するための推奨方法です。実際、 subList
のJavadocは特にこのイディオムを推奨しています。
この方法では、明示的な範囲操作(配列に一般的に存在する種類の操作)が不要になります。リストを期待するすべての操作は、リスト全体ではなくsubListビューを渡すことにより、範囲操作として使用できます。たとえば、次のイディオムはリストから要素の範囲を削除します。
_list.subList(from, to).clear();
_
確かに、このイディオムはremoveLast()
N
を呼び出すよりも(定数係数ではありますが)より効率的かもしれないと思います。これは、N
th-最後のノードまで、最後のN
ノードのそれぞれのポインターを一度に1つずつ更新するのではなく、リンクリスト内の定数のポインターを更新するだけで済みます。