2016-11-14 11 views
-1

私はJavaで単一リンクリストを使って両端キューを実装しています。私のaddFirst()機能は正常に動作していますが、addLast()は機能しません。あなたの最後は、最初にnullある私は、Javaで単一リンクリストを使用して両端キューを実装しています。私のaddLast()が動作していません

java.lang.NullPointerExceptionが

This is my function implementations

+0

'NullPointerException'に含まれている完全なスタックトレースは何ですか?あなたのエラーコンソールは、例外がスローされた行と、その時点までに呼び出されたすべての行を通知します。また、質問をするときは、スクリーンショットではなくテキストとしてコードを投稿してください。 – nbrooks

+3

あなたのコードを画像として投稿して、コードを投稿しないでください! – Li357

+0

addLastを呼び出すコードはどこですか? – MikeJRamsey56

答えて

0

コンストラクタが短いとDRYあなたのコードを維持するのに役立ちますあなたのNodeクラスを与える:

private class Node { 
    Item item; 
    Node next; 
    private Node(Item item, Node next) { 
    if (item == null) throw new NullPointerException(); 
// 'this' refers to the created instance and helps distinguish the field from the param 
    this.item = item; 
    this.next = next; 
    } 
} 

public void addFirst(Item item) { 
    // creates a new Node before first so to speak and then repoints first to this node 
    first = new Node(item, first); 
    if (num_elements==0) last = first; 
    num_elements++; 
} 

public void addLast(Item item) { 
    if (num_elements == 0) { 
    // this will deal with the case (last==null) which causes the NPE 
    addFirst(item); 
    return; 
    } 
    last.next = new Node(item, null); 
    last = last.next; 
    num_elements++; 
} 

さておき、単独リンクリストは、両端キューのための理想的なデータ構造ではないこと。両方の端に追加するのはO(1)ですが、背面から取り除くのはO(N)です!

+0

それは動作します!どうもありがとうございます。しかし、私はJavaにはまったく新しいので、実際の動作を理解できていません。たとえば、このコンテキストでは、クラスコンストラクタ、特にキーワード "this"について混乱します。また、addFirst()関数ではなぜfirst.next = new Node(item、first)の代わりにfirst = new Node(item、first)を使うのですか? –

+0

これらの点を明らかにするためにいくつかのコメントを追加しました。 'first.next = new Node(item、first)'は循環リンク構造を作成します。 'first'は新しいNodeを参照し、新しいNodeは最初を参照します。また、 'first'はここではnullなので、失敗する可能性があります。 – schwobaseggl

+0

ありがとうございました!また、別のJava Comparatorの質問に私を助けてくれますか?私はこれに本当に長い間立ち往生してきました!ありがとう! http://stackoverflow.com/questions/40622793/having-trouble-implementing-a-nested-class-comparator –

1

私はaddLast()を呼び出すたびに、私は次のエラーメッセージが表示されました。

old_lastに割り当てると、old_lastもnullになります。

old_last.nextに電話すると、NPEがスローされます。

+0

はい、それはまさに問題です。あなたはそれを修正する方法を知っていますか?私はあなたが単一リンクリストを持つキューを実装することができ、キューのaddLast()を実装するコードはまったく同じであることを知っています。次に、同じ実装がキューに対しては機能するが、両端キューに対しては機能しないのはなぜですか? –

+0

dequeの実装方法についてはhttp://codereview.stackexchange.com/questions/56361/generic-deque-implementationを参照してください。 – Gearon

関連する問題