2011-10-24 8 views
1

リンクリストのコンストラクタに問題があります。それは文字列を受け取り、すべての文字のノードを作成することになっています。java linked listコピーコンストラクタ

私はリストを印刷しようとするたびにnullpointerexceptionを取得します。それは、最初のノードが作成されていないことを意味しますか?

以下が私のノードクラスとリストコンストラクタです。

class CharNode { 

    private char letter; 
    private CharNode next; 
    public CharNode(char ch, CharNode link) 
    { 
     ch = letter; 
     link = next; 
    } 

    public void setCharacter(char ch) 
    { 
     ch = letter; 
    } 

    public char getCharacter() 
    { 
    return letter; 
    } 
    public void setNext(CharNode next) 
    { 
    this.next = next; 
    } 

    public CharNode getNext() 
    { 
    return next; 
    }  
} 

が、これは私のコンストラクタです

// constructor from a String 
    public CharList(String s) { 

    CharNode newNode = head; 

    for(int i = 0; i <s.length(); i++) 
    { 
     newNode = new CharNode(s.charAt(i), null); 
     newNode.setNext(newNode); 
    } 

    } 

は、私はそれを正しく構築するのですか?

答えて

0

pcalcaoと言いますと、=は、右側の値を左側の変数に割り当てます。あなたは、今

next = link;letter = ch;link = next;にあなたが与えてくれたコードの前にあるものを head指定したが、それは見ていない場合を除き、何も意味しない CharNode newNode = head;ラインを ch = letter;を変更する必要がありますいいね。リンクされたリストを作成するときは、何も開始しないので、 headのような「特別な」ノードでも作成する必要があります(インスタンス化することをお勧めします)。最初のノード(頭部)を作成するのは、 で、次にとすると、最初のノードに headが割り当てられます。最初のノード以降のすべてのノードでは、リストの末尾に追加するだけで、この手順は不要です。

最後に、構築中に、適切な追加を行うために、新しいノード(以前のものと同じ)と前のノードの両方への参照が必要です。あなたのコードでは、リストの次のノードを現在のノードに設定するだけです。つまり、新しいnewNodeを作成すると、以前のnewNodeへの参照が失われます。

最初に始めたときにリンクリストに近づける良い方法は、あなたが何をしたいのかを段階的に引き出し、それをコードに変換してみることです。うまくいけば、これは役に立ちます。

+0

は、それぞれのノードが別の名前を持つつもりですか?最初のものはnewNode、2番目のnewNode1は? – alexthefourth

+0

いいえ、そうでなければ、任意の長いリストを作成することに問題があります。 'curNode'と' prevNode'のようにノードへの参照が2つある場合、 'prevNode.next = curNode;'のようにループすることができます。その後、 'prevNode'を' curNode'を参照するように動かすことができます。新しいノードを作成し、 'curNode'を自由に割り当てることができます。私がリスト( 'head')の最初のノードを持っている限り、私はリスト全体にアクセスできます。 – brc

2

まず、あなたの属性は切り替わります!

ch = letter; 
link = next; 

はあなたのセッターに

letter = ch; 
next = link; 

同じものになるはずです。

フォームのJavaでの方法があります。

public void setSomething(String argument){ 
    this.classMember = argument; 
} 

が何をしたい通常ですが。あなたはあなたの議論をクラスメンバーに割り当てなければなりません。あなたのコンストラクタを呼び出しているとき

はまた、あなたが持っている:

newNode = new CharNode(s.charAt(i), null); 
newNode.setNext(newNode); 

あなたの「リンク」は、常に自分自身を指しているように、このそれを作ります!前のノードが作成したばかりのノードを指すようにするために何をする必要があるか考えてください。

十分明確でしたか?私がさらに説明できるかどうか知らせてください。

+0

おかげさまで、私はそれがちょっと見えてしまったように思っていましたが、私は確信していませんでした。それは私に手紙= chを持っているより意味をなさない – alexthefourth

+0

いいえprob:それが正しい軌道上であなたを得ることを望む!あなたの問題を解決するならば、答えを受け入れることができます。楽しむ! – pcalcao

+0

私は文字ごとに新しいCharNodeを作成する必要がありますか? – alexthefourth

関連する問題