をリストを操作するためのいくつかのイテレータ。これは、現在のインデックスのハウスキーピングを行うため、元のjava.util.LinkedListでは技術的に困難です。これは、他のイテレータによってリスト内の未知の位置に並列変更がない場合にのみ効率的に可能です。しかし、このハウスキーピングをしない単純なLinkedListを簡単に実装することができ、いくつかのイテレータを使って追加/削除をサポートします。イテレータはリスト内の位置を知らないが、あなたは気にしないだろう。
public class MyList<T> {
private MyNode<T> first = null, last = null;
public MyNode<T> getFirst() {
return first;
}
public MyNode<T> getLast() {
return last;
}
public boolean contains(MyNode<T> n) {
return n.list == this;
}
/**
* If beforeMe is null, toInsert is inserted at the end of the list.
* @return inserted node
*/
public void insertBefore(MyNode<T> beforeMe, MyNode<T> newNode) {
if (newNode == null) {
throw new IllegalArgumentException("toInsert must not be null!");
}
if (newNode.list != null) {
throw new IllegalArgumentException("This node is already in the list " + newNode.list);
}
if (beforeMe == null) {
if (last == null) {
newNode.prev = newNode.next = null;
first = last = newNode;
} else {
last.next = newNode;
newNode.prev = last;
newNode.next = null;
last = newNode;
}
} else {
newNode.prev = beforeMe.prev;
newNode.next = beforeMe;
if (beforeMe.prev != null) {
beforeMe.prev.next = newNode;
} else {
first = newNode;
}
beforeMe.prev = newNode;
}
newNode.list = this;
}
/**
* If beforeMe is null, t is inserted at the end of the list.
* @return inserted node
*/
public MyNode<T> insertBefore(MyNode<T> beforeMe, T t) {
MyNode<T> newNode = new MyNode<T>(t);
insertBefore(beforeMe, newNode);
return newNode;
}
public void remove(MyNode<T> n) {
if (n == null || n.list != this) {
throw new IllegalArgumentException("Node is not in the list!");
}
if (n.prev != null) {
n.prev.next = n.next;
} else {
first = n.next;
}
if (n.next != null) {
n.next.prev = n.prev;
} else {
last = n.prev;
}
n.prev = n.next = null;
n.list = null;
}}
public class MyNode<T> {
private T t;
/**
* written only by MyList
*/
MyNode<T> prev = null;
/**
* written only by MyList
*/
MyNode<T> next = null;
/**
* written only by MyList
*/
MyList<T> list = null;
public T get() {
return t;
}
public void set(T t) {
this.t = t;
}
public MyNode<T> previous() {
return prev;
}
public MyNode<T> next() {
return next;
}
public MyList<T> list() {
return list;
}
/**
* called only by MyList.
* @param t
*/
MyNode(T t) {
this.t = t;
}}
リストを1つのイテレータで変更すると、他のイテレータは使用できません。 –
CMEを取得しないので、代わりにConcurrentLinkedQueueを使用できますか?私はあなたがどんな場合でも何をしているのかをより効率的に行う方法があると考えています。 –
www.google.com/search?q=multi+dimensional+linked+list+javaなどのGoogleを検索し、http://www.dreamincode.net/forums/topic/282327-multi-dimensional-linkedのような結果を確認してください-list/ –