2016-11-20 8 views
0

私は既にその中にadd and traverseメソッドを持つ単一リンクリストの小さなプログラムを書いています。今私はそれを二重にリンクされたリストに変換したい。私は二重リンクリストの概念をすべて知っていますが、私は自分のプログラムでそれを実装するのがほとんど困難に直面しています。以下に単独で変換します。リンクリストを二重リンクリスト

public class SingleLinkList<T> { 

private Node<T> head; 
private Node<T> tail; 




public void add(T element) 
{ 
    Node<T> nd = new Node<T>(); 
    nd.setValue(element); 

    if (head==null) 
    { 
     head = nd; 
     tail = nd; 
    } 
    else 
    { 
     tail.setNextRef(nd); 
     tail = nd; 
    } 
} 

public void traverse(){ 

    Node<T> tmp = head; 
    while(true){ 
     if(tmp == null){ 
      break; 
     } 
     System.out.println(tmp.getValue()); 
     tmp = tmp.getNextRef(); 
    } 
} 

public static void main (String args[]) 
{ 
    SingleLinkList<Integer> s1 = new SingleLinkList<Integer>(); 
    s1.add(2); 
    s1.add(3); 
    s1.add(3); 

    s1.traverse(); 
} 

} 


class Node<T> { 

private T value; 
private Node<T> nextRef; 
public T getValue() { 
    return value; 
} 
public void setValue(T value) { 
    this.value = value; 
} 
public Node<T> getNextRef() { 
    return nextRef; 
} 
public void setNextRef(Node<T> nextRef) { 
    this.nextRef = nextRef; 
} 

public int compareTo(T arg) 
{ 
    if (arg==this.value) 
    { 
     return 0;} 
     else 
      {return 1;} 
    } 
} 
+0

_難易度? – Idos

+0

余分な手配をする方法。ノードに...私はこれを質問するとは思わないが、どこにそれをdownvoteすることができます – user1111880

+0

@アイドスはあなたの特定の質問は何と言うことをしようとしていると思いますか?まだ何か試しましたか?あなたが正しいです、これは悪い質問ではありませんが、問題が何であるか教えてください。 –

答えて

0

はちょうどNodeクラスにprivate Node<T> prevRef;インスタンス変数を追加し、add()方法の間に設定します。

public void linkReverse(Node<T> head) { 
    if (head == null) { 
     return; 
    } 
    head.setPrevRef(null); 
    if (head.getNextRef() == null) { 
     return; 
    } 

    Node<T> prev = head; 
    Node<T> curr = head.getNextRef(); 

    while (curr != null) { 
     curr.setPrevRef(prev); 
     prev = curr; 
     curr = curr.getNextRef(); 
    } 
} 

このメソッドはします:私はtraverse()

1

が適切なゲッターとセッターを使用して、リストクラスにNode<T> prevRefフィールドを追加し、このメソッドを追加ブール(またはより良い、列挙型)direction引数を受け取ることを示唆しています現在単独でリンクされたリストを歩き、各ノードを逆にリンクし、リストを二重にリンクしたままにする。

もちろん、他の方法も変更する必要がありますが、これは少なくとも適切な出発点です。

+0

あなたの答えからの手がかりを取って、私は以下のように私の実装を変更しました..しかし、それでも私は行方不明ですknwを教えてみましょう...クラスノード {\t \tプライベートT値; \tプライベートノード nextRef; \tプライベートノード prevRef; \t公共ボイド追加(T元素) \t {\t \tノード ND =新しいノード()。 \t \t nd。setValue(要素); \t \t \t \t場合(ヘッド== NULL) \t \t { \t \t \tヘッド= ND。 \t \t \t nd.setNextRef(null); \t \t \t nd.setPrevRef(null); \t \t \t tail = nd;他 \t \t} \t \t \t \t {tail.setNextRef(NULL)。 \t \t tail = nd; \t \t head.setNextRef(nd.getPrevRef()); \t \t \t tail.setPrevRef(head.getPrevRef());}} – user1111880

+0

'でも、それでも正しいわけではありません。何がうまくいかない?私は自分の論理が正しいと信じています。 –

+0

私はtraverse()メソッドを使用しているとき、最初のノード、すなわち2だけを無視し、他のノードデータは無視しています。 – user1111880

関連する問題