リンクされたリストのポイントは、どこにでも効率的に挿入 (および削除) できるようにすることであるため、Java の LinkedList でこれを見つけることを期待していました (挿入または削除する場所への何らかのポインターがあると仮定します)。私はAPIで何も見つけていません。私は何かを見落としていますか?
これに最も近いのは、ListIterator の add メソッドと remove メソッドです。ただし、これにはいくつかの制限があります。特に、API によると、基礎となる LinkedList が remove によって変更されるとすぐに、他の反復子は無効になります。これは私のテストでも生まれました。次のプログラムでは、IllegalStateException が発生します。
import java.util.*;
public class RemoveFromLinkedList {
public static void main(String[] args) {
LinkedList<Integer> myList= new LinkedList<Integer>();
for (int i = 0; i < 10; ++i) {
myList.add(i);
}
ListIterator<Integer> i1 = myList.listIterator();
ListIterator<Integer> i2 = myList.listIterator();
for (int i = 0; i < 3; ++i) {
i1.next();
i2.next();
}
System.out.println("i1.next() should be 3: " + i1.next());
i1.remove();
i1.remove();
// Exception!
System.out.println("i2.next() should be 5: " + i2.next());
}
}
理想的には、私が期待しているのは次のようなものです。
// In my imagination only. This is the way Java actually works, afaict.
// Construct two insertion/deletion points in LinkedList myLinkedList.
myIterator = myLinkedList.iterator();
for (...) {
myIterator.next();
}
start = myIterator.clone();
for (...) {
myIterator.next();
}
// Later...
after = myLinkedList.spliceAfter(myIterator, someOtherLinkedList);
// start, myIterator, and after are still all valid; thus, I can do this:
// Removes everything I just spliced in, as well as some other stuff before that.
myLinkedList.remove(start, after);
// Now, myIterator is invalid, but not start, nor after.
C++ のリストクラス (テンプレート) には、このようなものがあります。すべてのイテレータではなく、移動された要素を指すイテレータのみが無効になります。