2017-01-07 8 views
-2

私はJavaでリンクリストを学んだし、これが動作しない理由を私は理解していない:このリンクリストはコードを挿入し、他のコードは挿入しないのはなぜですか?

public static Node insert(Node head, int data) { 
    if (head == null) return new Node(data); 
    else { 
     Node tail = head; 
     while (tail != null) tail = tail.next; 
     tail = new Node(data); 
     return head; 
    } 
} 

これは非常にうまく動作しますが:両方のコードで

public static Node insert(Node head, int data) { 
    if (head == null) return new Node(data); 
    else { 
     Node tail = head; 
     while (tail.next != null) tail = tail.next; 
     tail.next = new Node(data); 
     return head; 
    } 
} 

をヌルエンドノードインスタンス化されます。なぜこれは同じ結果をもたらさないのでしょうか?

class Node { 
    int data; 
    Node next; 
    Node(int d) { 
     data = d; 
     next = null; 
    } 
} 
+0

'* 'instancialized' *' – GurV

+0

。 –

答えて

3

2番目のケースでは、新しいNodeを作成し、それを実際の末尾Nodeに接続するため、リストに追加されます。ここで、グラフィック表現

linked list insert

+0

最初のケースで 'tail = head'を設定した場合、' tail'がnullを指し始めるのはなぜですか? 'head'はnullではありませんか? – HugoB

+0

@HugoB最初の部分は、 'new Node(data)'の直前の状況で、 'while'ループの直後です。最初のケースでは、ループの後、 'tail'は' while'ループの終了条件であるため、nullです。言い換えれば、while(tail!= null)は、ループ 'tail'が' null'になった後のことを意味します。 –

+0

しかし、最初のケースでは 'tail'が何かに接続していなくても' head'が返されますが、 'tail'に接続してその値を持たなければいけませんか? – HugoB

-1
は、以下にご Nodeクラスを変更し

次のように

Nodeクラスです。

class Node { 
    int data; 
    Node next; 
    Node(int d) { 
     this.data = d; 
     this.next = null; 
    } 
} 

最初のノードを挿入する場合は、頭を新しいノードに設定します。

public static Node insert(Node head, int data) { 
    if (head == null) { 
     head = new Node(data); 
     return head; 
    } 
    else { 
     Node tail = head; 
     while (tail.next != null) tail = tail.next; 
     tail.next = new Node(data); 
     return head; 
    } 
} 

以下のノードを接続していない、それはむしろ、あなたが完全に新しいノードを作成し、あなたの現在の尖ったノードに割り当てされた後になりますので、あなたの最初のケースが動作していない理由。それだけでリストから外されますので、あなたは、新しいNodeを作成するが、何でそれを接続していない最初のケースで

while (tail != null) tail = tail.next; 
     tail = new Node(data); 
+0

質問を正しく読まなかった。希望downvoteは今取り戻されます。 – FallAndLearn

+0

ええ、最初のケース 'if(head == null)'では、現在のノードである 'head'に新しいノードを割り当てています。どうして? (downvoteは私のものではありません) – HugoB

+0

正しい。 headがnullの場合は、リストが空であるか、頭がnullを指していることを意味します。したがって、最初のノードを挿入するには、新しいノードを作成し、それを先頭に設定する必要があります。 – FallAndLearn

0
while (tail != null) tail = tail.next; 
tail.next

がnullの場合、ループが終了します。

その後は、次の操作を行います。

tail = new Node(data); 

nullにする最後の非ヌルtailnextポインタを残します。あなたが新しいノードに `head`を設定するのを忘れ`ヘッド== null`なのでケースのための両方のケースで


[head]---[1 (head.next)]---[2 (1.next)]---...---...---[last]---[nil (last.next)] 
+0

'tail'がnullのときにループが終了します。**' ** tail.next'ではありません。したがって、末尾のヌル 'tail'ポインタはnullにはなりません。 – HugoB

+0

なぜ 'tail'がnullになるのですか?それは最後の非ヌル 'tail'の' next'に割り当てられます。これはヌルです。 –

関連する問題