2016-12-06 6 views
2

Javaでリンクリストを読んでいましたが、このコードをプログラムしました。3を出力すると、挿入された数字の逆順が次のように出力されます:10 7 3 ..私のコードに何が間違っていますか?Javaでリンクリストを実装

public class List { 
    private class ListNode { 
     private int contents; 
     private ListNode next; 

     ListNode(int contents) { 
      this.contents = contents; 
      this.next = null; 
     } 
    } 

    private ListNode head; 

    public List() { 
     head = null; 
    } 

    public void insert(int contents) { 

     ListNode newNode = new ListNode(contents); 
     if (head == null) { 
      head = newNode; 
     } 

     ListNode current = head; 
     while (current != null) { 
      current = current.next; 
     } 

     current = newNode; 

    } 

    public void reverse() { 

     ListNode current = head; 
     ListNode nodeNext = current.next; 

     while (nodeNext != null) { 
      current.next = null; 
      nodeNext.next = current; 
      current = nodeNext; 
     } 

     head = current; 
    } 

    public String toString() { 

     String s = ""; 
     ListNode current = head; 
     while (current != null) { 
      s = current.contents + s; 
      current = current.next; 
     } 

     return s; 
    } 

    public static void main(String[] args) { 

     List l = new List(); 
     l.insert(3); 
     l.insert(7); 
     l.insert(10); 
     l.reverse(); 
     System.out.println(l.toString()); 

    } 
} 

おかげ

+1

値を挿入するときに、あなたが 'next'を設定することはありません。デバッガを使用すると、すぐにそのことが分かりました。 – jhamon

+0

あなたはこれをどういう意味ですか? 'public void insert(int contents、ListNode next){' –

+0

どうやってこれを計画しましたか?あなたはあなたが心に持っていたことを書いたのですか、それとも最初に紙でそれをしましたか? – AxelH

答えて

1
private ListNode head; 
private ListNode tail; 
public void insert(int contents) { 

    ListNode newNode = new ListNode(contents); 
    if (head == null) { 
     head = newNode; 
     tail = newNode; 
     return; 
    } 
    tail.next = newNode; 
    tail = newNode; 
} 

O(1)を挿入するためのテール・ノード参照してください。

あなたreverse()方法が少し間違っている:

// this loop will run forever if there are more than 1 nodes 
while (nodeNext != null) { 
    current.next = null; 
    nodeNext.next = current; // you lose the reference to the entire list here 
    current = nodeNext; 
} 
機能を書き換え

cursor.next = newHeadを行う
public void reverse() { 
    ListNode cursor = head; 
    ListNode newHead = null; 

    while (cursor != null) { 
     ListNode next = cursor.next; 
     cursor.next = newHead; 
     newHead = cursor; 
     cursor = next; 
    } 
    head = newHead; 
} 

を、cursor.nextに元の参照を失います。だから、あなたは一時変数にcursor.nextの参照を取る必要があります:ListNode next = cursor.next;

印刷機能を

public void print() { 
    ListNode cursor = head; 
    while (cursor != null) { 
     System.out.println(cursor.contents); 
     cursor = cursor.next; 
    } 
} 
+0

ありがとう..なぜ 'System.out.println(l。(void) ' –

+0

@senshinakamora私が書いた逆のメソッドは何も返さないので、返り値は返されません。 。型は 'void'です。 'void'型(型ではない)を' println() 'に渡していて、PrintStreamにvoid型の引数を取るメソッドはありません。 Eclipseは最初の種類のprintlnを仮定しています。これはブール値をとるため、エラーメッセージが表示されます – rafid059

+0

印刷機能を追加しました。 'l.reverse()'を呼び出し、 'l.print()'を呼び出します。 – rafid059

4

あなたinsert方法は、既存のリストの最後のノードに新しいノードを接続しません。あなたは、既存のリストの最後のノードのnode.nextに新しいノードを割り当てる必要があり:

public void insert(int contents) { 

    ListNode newNode = new ListNode(contents); 
    if (head == null) { 
     head = newNode; 
     return; 
    } 

    ListNode current = head; 
    while (current.next != null) { 
     current = current.next; 
    } 

    current.next = newNode; 

} 
+1

であると仮定しています: 'ヌルポインタアクセス:現在の変数はこの場所ではnullになる可能性があります 'コードがうまくいきません –

+1

@senshinakamoraループの条件を' while(current.next!= null) 'に変更したことに気付きましたか? – Eran

+0

いいえ私は申し訳ありません..今私はそれを実行するときに私は出力に何も表示されません..私の 'toString'メソッドに間違いはありますか?ありがとう –

関連する問題