2

私は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行の上に移動しています。これにより、すべての値が分離されているように見えます。

4

3 に答える 3

1

のコントラクトは、の後続の呼び出しは影響を受けず、の後続の呼び出しは新しい要素を返すことListIterator.add(Object)を指定します。これは、の実装で更新する目的です。nextpreviouspreviousadd

于 2013-02-27T17:57:52.817 に答える
1

あなたの教授はおそらくあなたにサンプルコードを与えましたが、それはコースの後半で拡張されます。サンプルコードには、将来的に二重リンクリストをサポートする部分が含まれているようです。二重にリンクされたリストは、リストの逆トラバースを許可します。 詳細については、ウィキペディアを参照してください。

まったく関係のないトピックについて。割り当てを完了するために単にプラグアンドチャグするのではなく、実際にあなたに与えられたものを理解して理解しようとしたことを称賛します。その習慣は将来あなたに役立つでしょう!

于 2013-02-27T17:58:34.720 に答える
0

これは私にはバグのように見えます。割り当ては、割り当ての前に行うprevious = current必要があります。次に、古いものを参照し、新しいものは新しく作成されたノードになります。current = newNodepreviouscurrentcurrent

于 2013-02-27T18:00:51.587 に答える