2016-08-31 9 views
-2

ユーザが作成したリンクリストの末尾に新しい要素を挿入しようとしています。ソリューション1が失敗したが、解決策2作品を、私は把握することはできませんよ、なぜ:リンクリストへの挿入がJavaで失敗する

class Node { 
    int data; 
    Node next; 
    } 

解決方法1:

Node Insert(Node head,int data) { 
     if(head == null) { 
      head = new Node(); 
      head.data = data; 
      head.next = null; 
     } else { 
      Node elem = head; 
      while(elem != null) { 
       elem = elem.next; 
      } 
      elem = new Node(); 
      elem.data = data; 
      elem.next = null; 
     } 
     return head; 
    } 

解決方法2:

Node Insert(Node head,int data) { 
     if(head == null) { 
      head = new Node(); 
      head.data = data; 
      head.next = null; 
     } else { 
      Node elem = head; 
      while(elem.next != null) { 
       elem = elem.next; 
      } 
      elem.next = new Node(); 
      elem = elem.next; 
      elem.data = data; 
      elem.next = null; 
     } 
      return head; 
    } 
+1

どうして失敗するのですか?実行時に例外が発生していますか?あなたは、問題が何であるか、それをどのように解決しようとしたかについて、より詳細な情報を提供する必要があります。 –

+0

解決策1では、次の文で 'elem'の値を破棄するときに' while'ループの目的は何ですか? *ヒント:その質問に対する答えはあなたの質問に対する答えです。* – Andreas

+2

* BTW:* 'head.next = null;'と 'elem.next = null;'は冗長です。 'next'はすでに新しい' Node'でnullです。 – Andreas

答えて

2

、あなたがnullを打つまでは、リストをナビゲートしている、とあなたは、リストには何もによって参照されていない新しいNodeを作成します。

Node elem = head; 
while(elem != null) { 
    elem = elem.next; 
} 
elem = new Node(); 

この最後の割り当ては変更されません。リスト内の任意の要素。したがって、あなたの新しいNodeはリストに参加しません。解決策2では

、あなたは(つまり、そのnext参照としてnullを持っている)最後の既存のNodeを取得するとき、あなたはそのnext参照として新しいNodeを追加しますので、あなたの新しいNode

Node elem = head; 
while(elem.next != null) { 
    elem = elem.next; 
} 
elem.next = new Node(); /* This adds the node after the last node */ 

これは動作しますリスト内の既存の要素によって参照されます。

0

whileループが終了すると、リンクされたリストの最後の要素になります。最初の解決策は最後の要素を上書きするだけで、次のelem(elem.next)に移動してから2番目のソリューションでデータを追加する必要があります。

+0

解決策1は何も上書きしていません。ループの最後では、 'elem'はnullであり、新しい' Node'が作成されますが、何かには接続されません。 – Andreas

+0

編集:私は今、あなたのポイントを取得しますが、ループの最後には、ヌルではない最後の要素にありますが、次のノードにジャンプして新しいノードを呼び出すのではなく、最後の要素で呼びます。 – PampaZiya

+1

はいループ*明らかに* while(elem!= null) 'と書かれています。つまり、' elem' **が** nullの場合にループが*終了するだけです。 Ergoは、ループが終了すると 'elem'はnullです。 – Andreas

-1

最初の解決策ではリスト内の最後の要素を反復処理します。最後の要素は変数 "elem"にありますが、最後の要素を失う同じ "elem"変数に割り当てられた新しい要素を作成します。解決策1で

+0

解決策1は最後の要素を見つけることができません。最後の要素の直後を 'null'値に反復しています。 – Andreas

+0

あなたは正しいです。それは最後の要素を見つけることさえできません。 – msaint

関連する問題