2017-06-22 9 views
0

ちょうどノードの学習を開始しましたが、いくつか質問があります。ノードの移動、挿入、削除についての質問

private E number; 
    private Node next; 
    /** 
    * Constructor 
    */ 
    Node(E e){ 
     number = e; 
     next = null; 
    } 

と私はそうのように最初の名前の開始ノードとリンクされた一連のノードを持っている:のは、私はこのようになりますノードクラスを持っているとしましょう

最初 - >(1) - >(2 ) - >(3) - >(5) - >(6)リストを想定し

は、リストをトラバースし、空ではないので、同じように、私は何かをするだろう:

Node curr = first; 
while(curr != null){ 
    System.out.print(curr); 
    curr = curr.next; 
} 

は、私はあなたのことを理解しこのようなリンクリストを後方にトラバースすることはできませんこれは、私がcurr.nextを呼び出すたびに、以前の要素が失われていることを意味しますか?

私の最初のリストがcurrのような一時的なノードリストの影響を受けるのではないかと疑問に思っていましたか?たとえば、私は、挿入またはこれらに類似のコードをリスト上のノードを削除した場合:

インサート:

Node curr = first; 
Node newNode = new Node(4); 
while(curr != null){ 
    if(curr.number == 3){ 
     newNode.next = curr.next; 
     curr.next = newNode; 
    } 
    curr = curr.next; 
} 

削除:

Node curr = first; 
Node parent = first; 
while(curr != null){ 
    if(curr.number == 3){ 
     parent.next = curr.next; 
    } 
    parent = curr; 
    curr = curr.next; 
} 

上記のコードは最初の修正だろうか変更の挿入または削除が行われた後にfirst = curr;を設定する必要がありますか?彼らが最初に変更を行う場合、どのようにcurr = curr.next;が最初に変更されないのでしょうか?削除したノードを返却したい場合はどうすればよいですか?私はちょうどcurr.next = null;のような何かをしてreturn curr;をやりますか?

答えて

0

これは、私がcurr.nextを呼び出すたびに以前の要素が失われていることを意味しますか?

リストを下にトラバースとして、あなたはfirstを変更されることはありません、あなたはどんなNodenextリンクを変更されることはありません。したがって、ノードは本当に失われません。これまでに訪問したノードは、「ハンドル」がないためアクセスが少し難しくなりましたが、リストの先頭(first)からnextのリンクをたどって、いつでも再びそれらを見つけることができます。

私の元のリストがcurrのような一時ノードリストの影響を受けるのではないかと疑問に思っていましたか?

変数first=の左側にfirstを持つ代入文以外のものの影響を受けすることはありません。一方、firstが参照するリストは、currを使用しているものによっては大幅に変更される場合がありますが、first自体は新しい値をfirstに割り当てることによってのみ影響を受けます。

上記のコードが最初に変更されるか、first = currを設定する必要がありますか。

与えられたとおり、挿入および削除コードは変更されませんfirst。しかし、でなければなりません。現在の最初のノードの前に新しいノードを挿入したり、現在の最初のノードを削除したりすることができるのであれば。具体的にはfirst = currではないかもしれませんが、firstは必ずリストの新しい頭部を反映するように更新する必要があります。私は教科書のように、「読者のための練習として」と言います。

+0

ありがとうございます!私はそれを得たと思う。それを参照するものが変更された場合、 'first'が変更されます。それ以外の場合は、変更が発生するように更新する必要があります。 –

関連する問題