Javaの:リンクリストから要素を検索し、削除するための最良の方法

アンディR:

私はかなりの時間のために、この疑問を抱いてきたし、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反復しながら、それはノードへのポインタを維持するので、任意の検索を必要としません。だから、削除するノード上の手を持っています。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=120029&siteId=1