2016-04-26 26 views
0

Ich habe eine Zuordnung in meiner CS-Klasse über zirkuläre doppelt verkettete Listen. Wir erhalten eine Knoten-Klasse, die die Links und Ähnliches einrichtet.Verstehen doppelt verknüpfte zirkuläre Liste

public class Node { 
private Node previous, next; 
private Object data; 

public Node(Object data) { 
    this.data = data; 
} 

public Node() { 

} 

public Node(Object data, Node previous, Node next) { 
    this.previous = previous; 
    this.next = next; 
    this.data = data; 
} 

public Node getPrevious() { 
    return previous; 
} 

public void setPrevious(Node previous) { 
    this.previous = previous; 
} 

public Node getNext() { 
    return next; 
} 

public void setNext(Node next) { 
    this.next = next; 
} 

public Object getData() { 
    return data; 
} 

public void setData(Object data) { 
    this.data = data; 
} 

}

und wir sind mit der Umsetzung ein paar Methoden beauftragt. In der Listenklasse gibt es einen Knoten, der 'Basis' genannt wird.

public class DList { 



private Node base; 

public DList() { 

} 

alle Methoden erfordern irgendeine Form der Durchquerung der Liste. Aus dem, was ich verstehe, einen Temp-Knoten gleich base.getNext() einrichten wird mir den ersten Knoten der Liste und testen, ob temp! = Basis wird meine Prüfung für das Erreichen des Endes der Liste, da der Basisknoten dient als Anker für den Rest der Knoten (wenn mein Verständnis stimmt).

Jedoch wenn ich versuche, ein Stück Code zu tun, wie zum Beispiel:

public int size() { 
    int count = 0; 
    if (base.getNext() == base) 
     return count; 
    else { 
     Node temp = base.getNext(); 
     while (temp != base) { 
      temp = temp.getNext(); 
      count++; 
     } 
    } 
    return count; 
} 

erhalte ich eine Null-Zeiger-Ausnahme an der Linie, wo ich Knoten Temp sagen = base.getNext(); und für das Leben von mir kann ich nicht verstehen, warum, denn wie ich schon sagte, ich dachte, dass base.getNext() wäre das erste Element meiner Liste.

visualization of CDLL

+0

Es ist kein Dummy-Basisknoten erforderlich. In diesem Fall ist "Basis" anfangs Null. Also 'wenn base == null ...' –

+0

Nun, Basis hat keine nächste. Es hat nichts! Ich schlage vor, dass Sie Ihrem Knoten eine Methode "hasNext" hinzufügen, die Ihre bevorstehenden Aufgaben erleichtert. – Tim

Antwort

0

Es besteht keine Notwendigkeit für einen Dummy-Basisknoten. In diesem Fall ist die Basis anfänglich Null. In diesem Fall:

public int size() { 
    int count = 0; 
    if (base != null) { 
     Node temp = base; 
     do { 
      temp = temp.getNext(); 
      count++; 
     } while (temp != base); 
    } 
    return count; 
}