2017-12-13 11 views
2

このコードは、JavaのLinkedList実装のものです。このメソッドは、リストのインデックスポイントに文字列要素を追加し、私のcsブックから取得します。Java Linked Listのポインターの混同

リンクリストクラスが2つのグローバルプライベート変数

Node first; 
Node last; 


public void add(int index, String e) { 
    if (index < 0 || index > size()) { 
     String message = String.valueOf(index); 
     throw new IndexOutOfBoundsException(message); 
    } 

    // Index is at least 0 
    if (index == 0) { 
     // New element goes at beginning 
     first = new Node(e, first); 
     System.out.println("ran"); 
     if (last == null) 
      last = first; 
     return; 
    } 

    // Set a reference pred to point to the node that 
    // will be the predecessor of the new node 
    Node pred = first; 
    for (int k = 1; k <= index - 1; k++) { 
     pred = pred.next; 
    } 

    // Splice in a node containing the new element 
    pred.next = new Node(e, pred.next); 
    System.out.println(toString()); 

    // Is there a new last element ? 
    if (pred.next.next == null) 
     System.out.println("ran"); 
     last = pred.next; 
} 

私の質問
を持っている私はNode first, last

下回る状態に更新されますどのように理解していません

あなたがそして、あなたが要素「4」のインデックスに3

ので、リストは好き["1","2","3","4","7","4","5,"6"]に見える追加しますが、addメソッドのコードを見ると、私は方法がわからない

["1","2","3","7","4","5,"6"]のように見えますイスト最初または最後ノードポインタが更新されます。インデックスが0でなく、最後は変更されませんので、私の心の中でこれらが実行コードの唯一の作品があるので

EDIT

ノードfirstはtoStringメソッドで使用されているオブジェクト(図示されていない)追加する前に収集

// Set a reference pred to point to the node that 
    // will be the predecessor of the new node 
    Node pred = first; 
    for (int k = 1; k <= index - 1; k++) { 
     pred = pred.next; 
    } 
    // Splice in a node containing the new element 
    pred.next = new Node(e, pred.next); 
    System.out.println(toString()); 
+0

私はこの追加メソッドをテストしています。 – cheesey

答えて

0

を横断するように、最初の要素は「1」であり、最後の要素は「6」です。
追加後、最初の要素は "1"で、最後の要素は "6"です。
最初にが最後にに変更されていません。最初の要素または最後の要素が変更されていないため、変更する必要はありません。

+0

これをテストしたところ、10個の要素でリストを埋めた後、インデックス6に値を追加し、Node **ファースト**を使用してコレクションをトラバースするtoStringメソッドを実行しました。出力は正しいものの、最初のノードオブジェクトがどのように更新されたかわからない。 – cheesey

0

私はあなたがこのリンクされたリストの実装がうまくいかないことに悩まされていると思います。 firstlastポインターが存在し、リストの開始と終了を追跡するだけです。したがって、リストの途中に要素を挿入すると、これらのポインタは更新されず、そのような更新の必要もありません。しかし、彼らはを行うは、現在の頭の前に、またはリストの現在の尾の後に挿入土地を更新する必要があります。ここでヘッドインサートを処理するコードは次のとおりです。

if (index == 0) { 
    // New element goes at beginning 
    first = new Node(e, first); 
    System.out.println("ran"); 
    if (last == null) 
     last = first; 
    return; 
} 

ここで重要なラインは、実際にはこれです:

first = new Node(e, first); 

firstポインタがターンポイントで旧への新しいノードに割り当てられますfirstノード。同様に、リストの最後に新しいノード土地の挿入は、次のコードはそれを処理する必要があります。ここでは

if (pred.next.next == null) { 
    System.out.println("ran"); 
    last = pred.next; 
} 

lastポインタが古いlastを挿入された新しいノードに割り当てられています。

しかし、これら二つのエッジケース以外に、インサートをfirstlastを更新する必要はありません。

+0

**最初の**ノードリスト内の他のすべてのノードへの参照と考えて、ソースコードの他の部分にはtoStringメソッドを生成することができますが、行には** first =新しいノード(e、最初); ** – cheesey

+0

'最初または最後のノードポインタがどのように更新されるのかわかりません。... ...私はこの質問に私の知識に答えました。なぜ、あなたが 'first'と' last'ポインタを維持したいのかという議論が必要なら、それは後の時点で2番目の質問かもしれません。 –

0

インデックスが0の場合、ノードはbeginnngで追加され、forループは機能しません。 1の場合、ループは再び実行されず、ノードは単にリストに追加されます。 しかし、それ以外の場合は、インデックス-1の位置に達するまで、ループは各要素を1ステップ遅らせます。次に、ループのすぐ外側のコード(新しい要素を含むノードでスライスする)は、その要素をindexに挿入します。 ループが実行された後、インデックスが最後のものであると判明した場合、最後のノードが更新されます。

希望すると便利です。

関連する問題