私はLinkedListsで実践的な大学を通り抜けています。LinkedListをトラバースするイテレータのadd()メソッドを理解するのに苦労しています。私たちの講師はこれを実装するためのコードを私たちに与えたので、彼から正確にコピーします:
public class LinkedList
{
public LinkedList() {
Node first = null;
}
class Node {
public Object data;
public Node next;
}
class LinkedListIterator implements ListIterator {
public LinkedListIterator() {
Node position = null;
Node previous = null;
}
public void add (Object element) {
if (position == null) {
addFirst(element);
current = first;
} else {
//1 Node newNode = new Node();
//2 newNode.data = element;
//3 newNode.next = current.next;
//4 current.next = newNode;
//5 current = newNode;
}
previous = current
}
注:私は意図的に変数をカプセル化せず、スペースを節約するために余分なコードを切り取りました。コンパイルされないことは承知していますが、私の質問はより概念的なものです。
addメソッド
の場合:ifステートメントは、イテレーターの位置がnullであるかどうかを検出するだけです。この場合、LinkedListの先頭に要素を追加し、この新しく作成されたノードにイテレーターの位置を設定します。
elseステートメントは私を混乱させます:
1行目と2行目:新しいノードが作成され、そのデータが要素パラメーターに設定されます。
3行目では、この新しいノードの次の変数が現在のノードの次のノードに設定されています。つまり、イテレータが指しているノードの位置の後の変数に設定されています。4行目、イテレータが現在
指し
ているノードの「次の」ノードがnewNodeに変更されます(2つの既存のノード間の新しいノードの挿入が事実上完了します)。
5行目、イテレータの位置はnewNodeを指すように設定されています。
elseステートメントの後、イテレータがポイントしていた前のノードが現在のノードに設定されます。
ここに問題があります-それを行うと、イテレータの位置と前の位置が効果的に同期されます。Eclipseデバッガーでこれを確認しました。これにより、以前は役に立たなくなります。ただし、とにかく標準のイテレータを使用してLinkedListを逆トラバースすることはできないことを認識しています。
この行をコメントアウトすると、何も変わらないようです。この行は単に不要なのですか、それとも私が実際には実現していない機能がありますか?(私が尋ねているもう1つの理由は、これの逆がremove()メソッドのメモに表示されているためです。これも目的がないようです。
編集:私のコースが発展するにつれて、この答えは答えられるかもしれないようです。今のところ、前の=現在の行を現在の=newNode行の上に移動しています。これにより、すべての値が分離されているように見えます。