2016-12-08 12 views
0

リンクリストの実装を作成中で、addメソッドに問題があります。いくつかのエントリでそれをテストした後、私のsize()メソッドは常に1を返します。何が間違っているのですか? return size(currentNode.next);の代わりにリンクリストに複数の項目を追加する

public class Node { 

    public int data; 
    public Node next; 

     public Node(int data){ 
     this.data = data; 
    }  
} 


public class LinkedList { 

    public Node first; 
    public Node last; 

    public LinkedList(){ 
     first = null; 
     last = null; 
    } 

    public void add(int data){  
     Node newNode = new Node(data); 
     if(first == null){ 
      first = newNode;   
     } else { 
      add(first, newNode); 
     }     
    } 

    public void add(Node currentNode, Node newNode){ 

     if(currentNode.next != null){ 
      add(currentNode.next, newNode); 
     } 
     currentNode.next = newNode; 
    } 
     public int size(){   
     if(first == null){ 
      return 0; 
     } 
     else{ 
      return size(first); 
     }   
    } 
    public int size(Node currentNode){ 
     //Count Starts At One Because First = 1. 
     int count = 1;   
     if(currentNode == null){ 
      return count; 
     } 
     else { 
      count++; 
      return size(currentNode.next); 
     }    
    } 
} 
+0

一般に、バグを見つけたときには、直接編集しないでください。それはあなたの質問とすべての関連する回答を完全に無効にします。 –

+0

特にこれらの編集が無意味であるか、まったく間違っている場合。 –

+0

私は編集したコードを編集したものを元に戻しました(フォーマットしていません)。しかし、あなたのコードを読みやすくするために、より良いコードを作成することについての賞賛。それは非常に有用であり、あなたはそれを続けなければなりません。 –

答えて

1

addの2-arg形式のelseを忘れました。現状では、

if(currentNode.next != null){ 
    add(currentNode.next, newNode); 
} 
currentNode.next = newNode; 

は常にリスト内の他のすべてのノードにfirstに新しいノードを追加します。 else句にcurrentNode.next = newNodeが含まれている場合、末尾に正しく追加されます。

また、最終分岐が常に1を返すため、sizeメソッドは常に1を返します。この問題を解決するには、また

return 1 + size(currentNode.next); 

count++; 
return size(currentNode.next); 

を変更、return 1;return count;を交換してください。

基本的に、実装はほぼ正しいです。 size(Node)は、そのノードで始まるリストのサイズを返す必要があります。ノードにnextがない場合、サイズは1です。それ以外の場合は、現在のノード(1)+残りのテールのサイズです。

あなたが公衆にあなたのリストの内部を公開したくないので、あなたは(実際には、Nodeクラスがprivateである必要がありますaddsizeprivateの1、引数バージョンの2-argのバージョンを確認する必要がありクラスも同様)。

さらに、クラスのlastフィールドは使用しません。これを削除するか、または再利用の必要性を完全に回避するために、addでそれを使用することができます。後者の場合、新しい追加ごとに正しく更新する必要があります。

+0

マッド物理学者に感謝します。ノードクラスは別個のプライベートクラスです。私はそれを表示目的のためにそこに掲載しました。 (私はそれに留意すべきだった)。 – user2912983

+0

心配はいりません。正確な内部構造はそれほど重要ではありません。 'public class Node ...'を読み込んでいるので、公開されていると仮定しました:) –

0

それがリストの罰金である、ことを考えると数の問題を修正します。このreturn count + size(currentNode.next);

を試してみてください。しかし、あなたのコードを一目で確認することは、リスト追加コードもバグであるように見えます。

関連する問題