2016-11-20 4 views
0

Ich habe bereits ein kleines Programm der einzelnen verketteten Liste mit Add und Traverse-Methode in diesem geschrieben. Jetzt möchte ich es in eine doppelt verkettete Liste umwandeln. Ich kenne das Konzept der doppelt verketteten Liste, aber ich habe wenig Schwierigkeiten, es in meinem Programm zu implementieren.unten einfach umwandeln Verknüpfte Liste zu doppelt verkettete Liste

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

_What_ Schwierigkeit? – Idos

+0

Wie man extra refe legt. zu einem Knoten ... Ich denke nicht, dass dies eine Frage ist, wo Sie es runterstufen können – user1111880

+0

Ich denke was @Idos versucht zu sagen ist, was ist Ihre spezifische Frage? Hast du schon etwas probiert? Sie haben Recht, das ist keine schlechte Frage, aber sagen Sie uns, was das Problem ist. –

Antwort

0

nur private Node<T> prevRef; Instanzvariable Node Klasse hinzufügen, und es während add() Verfahren eingestellt. Ich schlage vor, dass traverse() eine boolean erhalten (oder noch besser, Enum) direction Argument

1

hinzufügen Node<T> prevRef Feld zu Ihrer Liste Klasse mit entsprechenden Getter und Setter und dann diese Methode hinzufügen:

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(); 
    } 
} 

Diese Methode wird Wenn Sie auf eine Liste mit derzeit einfach verknüpften Listen gehen, werden die einzelnen Knoten in umgekehrter Reihenfolge verknüpft, sodass die Liste doppelt verknüpft bleibt.

Natürlich müssten Sie auch die anderen Methoden ändern, aber das ist zumindest ein guter Ausgangspunkt.

+0

eine Ahnung von Ihrer Antwort, habe ich meine Implementierung wie folgt geändert .. aber immer noch ist es nicht korrekt lassen Sie mich wissen, was ich vermisse ... Klasse Knoten {\t \t privaten T-Wert; \t privater Knoten nextRef; \t privater Knoten prevRef; \t public void add (T-Element) \t { \t \t Knoten nd = new Node (); \t \t nd.setValue (Element); \t \t \t \t if (Kopf == null) \t \t { \t \t \t head = nd; \t \t \t nd.setNextRef (null); \t \t \t nd.setPrevRef (null); \t \t \t Schwanz = nd; \t \t} \t \t sonst \t \t {tail.setNextRef (null); \t \t Endstück = nd; \t \t head.setNextRef (nd.getPrevRef()); \t \t \t tail.setPrevRef (head.getPrevRef());}} – user1111880

+0

'aber noch ist es nicht korrigieren lassen Sie mich knw wht i missing' bin ... sind Sie wieder vage. Was funktioniert nicht? Ich glaube, dass meine Logik richtig ist. –

+0

Wenn ich die Methode traverse() verwende, wird nur der erste Knoten gelöscht, d. H. Nur 2 und nicht andere Knotendaten. – user1111880

Verwandte Themen