2011-03-26 21 views
0

宿題については、ノードとポインタを使用して循環リンクリストを作成することになっています。
これは私がリストの先頭に文字列(名前)を挿入して、トラバースメソッドを使用して、それらをプリントアウトしようとしていますJavaの二重循環リンクリストへの挿入

class Node implements Serializable { 
    public String theName; //the wrapped name 
    public Node next;  //the next node in the sequence 
    public Node prev;  //the previous node in the sequence 

    public Node(Node p, String s, Node n){ 
     prev = p; 
     theName = s; 
     next = n; 
    } 
} 

私のノードクラスです。
は、これまでのところ、これらは、私はそれが最初に戻って取得するときに私のトラバース方法は、それを停止する私の連続ループと私が作る方法を把握する必要がありますことを理解し

public class ListImpl /*implements List*/ { 
    Node list; 

    public ListImpl() { 
     list = new Node(list, null, list); 
    } 

    public void insert(String s) { 


     if (list == null) { 
      list = new Node(list, s, list); 
     } else { 
      list = new Node(list.prev, s, list); 
      list.next.prev = list; 
      list.next.next = list; 



     } 
    } 

    public void traverse(ASCIIDisplayer out) { 

     Node p = new Node(null, null, null); 
     p = list; 
     if (list != null) { 

      while(true) { 
       out.writeString(p.theName); 
       p = p.next; 
      } 
     } else { 
      throw new EmptyListException(); 
     } 
    } 
} 

...私のトラバースし、挿入する方法ですそれは私の問題ではありません。私が手

public class Main { 
    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 

     ASCIIDisplayer a = new ASCIIDisplayer(); 
     ListImpl List; 

     List = new ListImpl(); 
     List.insert("Steve"); 
     List.insert("Kuba"); 
     List.insert("Taylor"); 
     List.insert("Jane"); 

     List.traverse(a); 
    } 
} 

出力は次のとおりです:テイラージェーン・テイラージェーン・テイラージェーン・テイラージェーン
は、私は(メイン)このコードを実行すると、私の出力が期待されていないようので、私の問題は、insertメソッドであると考えています。 ..繰り返される。
私は次のような出力を期待していました:Steve Kuba Taylor Jane Steve Kuba Taylor Jane ...繰り返しました。

これは、問題が挿入メソッドにあると考えているため、ポインタが間違ったノードを指している必要がありますが、私が間違ったことを理解できません。

申し訳ありませんが長い質問のために、うまくいけば私を助けるための十分な情報があります! ありがとうございます!あなたのinsertメソッドで問題がなければならないの

+0

これはところで – Argote

+0

はい、私が指定するのを忘れて二重にリンクされたリストのように見えます、はい、私は私が間違って何をしたか見...しかし、私はその行 – Cheesegraterr

答えて

2

この置き換えてください。これで

list = new Node(list.prev, s, list); 
    list.next.prev = list; 
    list.next.next = list; 

:あなたはノードを繰り返したときに、あなたが最初のノードを保存して比較することによって、それは同じだ場合のことを行うことができます考え出すについては

Node tmpList = new Node(list.prev, s, list); 
    list.next.prev = tmpList; 
    list.prev.next = tmpList; 
    list = tmpList; 

を次のノード、それが起こるとあなたはリストの終わりに達します。あなたのコンストラクタに渡されるlistパラメータの両方がnullている、あなたはどちらかという新しいコンストラクタを作ることによって問題を解決する必要があり、その場合には

if (list == null) { 
    list = new Node(list, s, list); 

:あなたはこれを行う最初のノードを挿入しても

Stringの値を取得し、それ自体を参照するか、prevnextを手動で設定してください。ここで

は、コンストラクタのソリューションです:

class Node implements Serializable { 

public String theName; //the wrapped name 
public Node next;  //the next node in the sequence 
public Node prev;  //the previous node in the sequence 

public Node(Node p, String s, Node n){ 
    prev = p; 
    theName = s; 
    next = n; 
} 
public Node(String s){ 
    prev = this; 
    theName = s; 
    next = this; 
}} 
+0

に感謝:それはあります既存のリストへの参照が失われたリストの新しいリストを作成していることを確認してください。私の編集を参照してください。 – Cheesegraterr

+0

@CheesegraterrでNullPointerExceptionが取得することに切り替えた後、あなたにargote – Argote

+0

hmmm私もそれを試して、まだlist.next.prev = tmpListでnullポインタを取得します。 – Cheesegraterr

0

list.next.prev = list; 
    list.next.next = list; 

ものはありasymmeticように見えますか?

質問には関係ありませんが、listはいつでもnullとなることがありますか?それはすべきでしょうか?

0

あなたのインサートのこの部分は

} else { 
    list = new Node(list.prev, s, list); 
    list.next.prev = list; 
    list.next.next = list; 

間違って見える最後の行は次のようになります。

list.prev.next = list 
0

は内部else枝をよく見ますinsert関数を使用して、実際にt o list.next.next=listを設定します。

関連する問題