Ich lese ein Buch über "Datenstrukturen und Algorithmen", in dem es eine Aufgabe gibt, die mich auffordert, eine zirkuläre verkettete Liste zu implementieren. Dies ist eine Lernübung und mein Code ist möglicherweise nicht von sehr hohem Standard.Wie implementiert man zirkuläre verkettete Liste in Java?
Der Grundgedanke hinter meiner Implementierung einer zirkular verknüpften Liste ist ein Zeiger, der auf das letzte Element zeigt und jedes Mal, wenn ich ein neues Element hinzufüge, wird das Feld 'next' des letzten Elements aktualisiert neu hinzugefügter Artikel
Die Einfügemethode funktioniert gut, ich kann Element ohne Probleme hinzufügen, aber aus irgendeinem Grund kann ich keine Elemente aus der Liste löschen. Hier
ist der Code für ‚Link‘ oder ‚Knoten‘:
public class Link {
public long data;
public Link next;
public Link(long val) {
data = val;
next = null;
}
public void displayLink() {
System.out.print(data + " ");
}
} // end class
Dies ist der Code für die Klasse, die die Arbeit ausführt, und der Fehler ist offensichtlich irgendwo hier:
public class CircularList {
Link first;
Link last;
public CircularList() {
first = null;
last = null;
}
public Link find(long key) {
Link current = first;
while(current.data != key) {
current = current.next;
}
return current;
} // end find
public Link delete() {
if(first.next == null)
last = null;
Link temp = first;
first = first.next;
return temp;
} // end delete
public boolean isEmpty() { return (first == null); }
public void insert(long val) {
Link newLink = new Link(val);
if(isEmpty())
last = newLink;
newLink.next = first;
first = newLink;
last.next = first;
} // end insert
public void displayAmount(int n) {
Link current = first;
while(n>0) {
current.displayLink();
current = current.next;
n--;
}
System.out.println("");
} // end displayAmount
} // end class
und die Haupt App-Code:
public class App {
public static void main(String[] args) {
CircularList cl = new CircularList();
cl.insert(10);
cl.insert(20);
cl.insert(30);
cl.insert(40);
cl.displayAmount(6);
cl.delete();
cl.displayAmount(6);
}
} // end class
die Anzeige Menge Art von albern aussieht, ich habe gerade versucht Endlosschleife und m zu vermeiden ade etwas einfaches, das einfach funktioniert.
Und was ist Ihre Frage? –
Ihr verknüpfter Listenknoten fehlt eine Referenz auf den vorherigen Knoten, so dass die Entfernung unmöglich ist. Sie möchten, dass sich das letzte Element sowohl auf das erste als auch auf das erste Element bezieht, dh beide müssen ein nächstes und ein vorheriges Element haben. Mit diesen können Sie ein beliebiges Element verwenden, das vorherige und das nächste Element auf dem aktuellen Element abrufen und das vorherige Element mit dem nächsten verbinden, wodurch das zu löschende Element effektiv ausgeschnitten wird. –
@G_V die 'delete()' Methode, wie es immer steht (versucht), das erste Element zu löschen, was OK ist, weil sein Vorgänger 'last' ist. Sie müssten es doppelt verknüpft werden, wenn Sie beliebige Elemente löschen möchten, aber wenn Sie nur "zuerst" löschen, brauchen Sie das nicht. –