私はかなりの時間のために、この疑問を抱いてきたし、SOにはまだそれに良い答えを見つけることができます。
私は何をしたいリンクリスト内の要素を見つけて、すぐにそれを削除することです。私は自分でリンクリストを構築した場合Ijustは、二重リンクリストをトラバースするので、それは、簡単に次のようになります。
-> N1 <-> N2 <-> N3 <-> N4 <-> N5 <-
あなたが例えばN3を見つけたとき、あなたがそのようなことnode.previousやnode.nextポインタを変更します。
-> N1 <-> N2 <-> N4 <-> N5 <-
中央での要素ならば、これはおおよそN / 2のステップを必要とするであろう。
でこれを行うには、適切なアプローチはありますかjava.util.LinkedList<Integer>
?
私のために不十分であるアプローチは次のとおりです。
Integer found = null;
for(Integer elem : list){
if(hasCertainProperty(elem)){
found = elem;
}
}
if(found != null){
list.remove(found);
}
要素がリスト内の中間要素(二重リンクリスト、インデックスが知られている場合ので、リストの末尾から検索することは理論的に可能である)である場合には、おおよそN / 2 + N / 2 = N段階の最大値を必要とするであろう。自作のトラバース中のに対し、それが唯一のn / 2の手順が必要になります。
N / 2が実際に違いを作ることを時々、私はそれらの2と他のアプローチは、O(n)の中で知っているが、あなたは知っています。
ご協力いただきありがとうございます。
Javaの8はあなたのためにこれを行います。
list.removeIf(x -> hasCertainProperty(x));
これは、内部で、リストをループし、各項目をチェックしx
、それを満たしてあなたの状態かどうかhasCertainProperty
、アイテムを削除します。私はあなたのパフォーマンスを心配すべきではないと思います。Javaはあなたのためにそれを処理します。
それとは別に、あなたが使用する必要がありますListIterator
まさにその目的のために行われました。あなたは使用して、それを得るのLinkedList#反復子を:
ListIterator<Integer> listIter = list.listIterator(0);
while (listIter.hasNext()) {
Integer element = listIter.next();
if (hasCertainProperty(element)) {
listIter.remove();
break;
}
}
ITSはremove
反復しながら、それはノードへのポインタを維持するので、任意の検索を必要としません。だから、削除するノード上の手を持っています。