Listenelement einfügen

Hallo,

ich habe bezüglich des Einfügens eines Elementes in einer Liste ein paar Verständlichkeitsfragen.

Die Fragen befinden sich als Kommentare im Quelltext.
Ich hoffe, dass mir jemand helfen kann.
Vielen Dank.


Java:
public class Übung_Liste {
   class Liste {
     Listenelement Anfang;
     class Listenelement {
       int nutzdaten;
       Listenelement next;
       Listenelement(int daten) {
         this.nutzdaten = daten;
         next = null;
       }
       void Liste() {
         Anfang = null;
       }
       void einfügen_vorne(int wert) {
         Listenelement zweites = Anfang;
         Anfang = new Listenelement(wert);
         Anfang.next = zweites;
       }
       void einfügen_dahinter(int wert) {
         Listenelementübernächster = next;
         next = new Listenelement(wert);
       }
       void einfügen_hinten(int wert) {
         Listenelement letztes = Anfang;
         if (Anfang == null) {
           Anfang = new Listenelement(wert);
         } else {
           while (letztes != null) {
             letztes = letztes.next;
           }
         }
       }
     }
   }
}
 
Zuletzt bearbeitet von einem Moderator:
  1. Listenelement next ist ein Listenelement in einem Listenelement, fungiert an dieser Stelle als Zeiger.
  2. Naja, zeichne dir mal auf, was bei einfügen_dahinter passiert, so wie es momentan da steht, dürfte es aber auch nicht funktionieren! Es fehlt ein äußerst relevanter Schritt.
  3. einfügen_hinten ist an dieser Stelle auch noch nicht komplett, da das tatsächliche Einfügen fehlt (bzw. nur funktioniert, wenn die Liste aktuell leer ist). Was in letztes drin steht, ist ganz klar, entweder entspricht es Anfang, oder (sofern die Liste nicht leer ist) entspricht es nach der Schleife im else-Teil dem letzten Element der Liste, zumindest wenn hier noch ein kleiner Fehler behoben wird. Aktuell sollte dir das Programm nämlich mit einer NullPointerException um die Ohren fliegen.
Mit freundlichen Grüßen
Xelsarion
 
Da sind schon einige Sachen dabei, die mir helfen, danke!

1. ist jetzt klar
2. Hier fehlt eine Überprüfung, ob die Liste leer ist und es muss ein Zeiger von diesem neuen Element auf das bestehende Nachfolgende gemacht werden.
Aber verstehe ich das richtig, dass übernächster ein neues Listenelement ist, auf welches vom aktuell letzten Element der Liste gezeigt wird? Mich verwirrt das deshalb, weil ich hier erwartet hätte, dass es genau andersherum da steht: next = Listenelement übernächster.
3. Hier würde ich in der While-Schleife noch letztes.next = new Listenelement (wert) einfügen.
Was in letztes drinsteht habe ich verstanden
 
  1. Gut 🙂
  2. Nein, übernächster ist nicht das neue Element. Du hast deinen Zeiger auf einem Element, dann erstellst du einen zweiten Zeiger (übernächster), den du auf das Element hinter dem Zeiger zeigen lässt. Danach erzeugst du ein neues Element, dass du hinter das Element des ersten Zeigers hängst. Der Schritt, der anschließend fehlt, ist, dass hinter das neu erzeugte Element noch die alte Restliste drangehangen wird. Die alte Restliste startet bei deinem Zeiger übernächster, der dafür da ist, sich diese zu merken. An dieser Stelle möchte ich noch erwähnen, dass du in deinem Code möglichst Umlaute etc. vermeiden solltest!
  3. Das ist schon mal eine essenzielle Ergänzung. Überleg dir jetzt jedoch noch, was in der Schleife passiert, wenn du aktuell auf dem letzten Element stehst!
Mit freundlichen Grüßen
Xelsarion
 
Ich habe hier mal ein Schaubild erstellt. Ist das richtig?
Also benutze ich den zweiten Zeiger übernächster auf next damit die Restliste nicht verloren geht?
Zeigt next dann immer auf den Nachfolger von dem 1. Element und next.next auf das 2. usw.?
Weil ich dachte next wäre die Referenz des letzten Elementes in der Liste.
 

Anhänge

  • Listenelement.png
    Listenelement.png
    15,3 KB · Aufrufe: 26
Du betrachtest ja immer ein bestimmtes Element und next beschreibt eben von da aus gesehen immer das nächste. Wenn du also beispielhaft eine Liste a -> b -> c -> null hast, ist
  • a.next == b, a.next.next == c, a.next.next.next == null
  • b.next == c, b.next.next == null
  • c.next == null
Da du dir im Programm meistens nur den Kopf der Liste merkst, benutzt du dann eben temporäre Zeiger, mit denen du dann über deine Liste iterierst.

Mit freundlichen Grüßen
Xelsarion
 
Was genau soll dein Schaubild darstellen? Bis jetzt stellt es ja da, dass das neue Element eingefügt und mit an die Liste angehangen wurde, während du dir die Restliste merkst. Jetzt fehlt quasi der Schritt, an dem die Restliste wieder angehangen wird, falls du das aber so beabsichtigt hast, scheint alles okay zu sein.

Mit freundlichen Grüßen
Xelsarion
 

Zurück
Oben