kurze frage zu meinem Code ...

Mino1337

Mitglied
Hallo,

dieser Code macht eine Doppelt verkettete Liste und funktioniert NUR in einer zeile komme ich nicht klar =) ...

Java:
public class DoppeltVerketteteListe<T> {
private class ListElem {
T data;
ListElem next;
ListElem prev;
public ListElem(T data) {
this.data = data;
}
}
private ListElem head;
private ListElem tail;
public Liste() {
head = null;
tail = null;
}
public void add(T data, int i) {
ListElem newElem = new ListElem(data);
//leere Liste, kann nach Aufgabenstellung auch weggelassen werden
if(head == null) {
head = newElem;
tail = newElem;
}
//Liste hat mind. 1 Element
else {
ListElem current = head;
int currentIdx = 0;
while(current.next != null && currentIdx < i) {
current = current.next;
currentIdx++;
}
//i <= Listenlaenge
if(currentIdx >= i) {
newElem.next = current;
newElem.prev = current.prev;
newElem.next.prev = newElem;
if(current == head)
head = newElem;
else
newElem.prev.next = newElem;
}
//i > Listenlaenge
else {
newElem.prev = current;
newElem.prev.next = newElem;
tail = newElem;
}
}
}
}

In Z25 da steht
Java:
ListElem current = head;
, das geht irgendwie nicht weil das Objekt current nicht erzeugt wurde mit dem "new" ...

Es soll ja einen zeiger darstellen aber ich verstehe auch nicht so recht woher dieses Mysteriöse current jetzt weiss wer sein vorgänger und wer sein nachfolger ist aber das habe ich mal einfach so als fakt hingenommen ...

Also wenn current kein Objekt ist was ists dann ?!
 
In Z25 da steht
Java:
ListElem current = head;
, das geht irgendwie nicht weil das Objekt current nicht erzeugt wurde mit dem "new" ...

Ja ist auch nicht notwendig! Du weißt "current" den Wert von dem Attribut "head" zu.
Sprich nach dieser Zeile zeigen "current" und "head auf dasgleiche Element 🙂

Am besten du führst den Code einfach testweise aus und debuggst ihn! Dann wird dir wahrscheinlich vieles klarer.
 
Zuletzt bearbeitet:

... ist ohne Einrückung unlesbar!

Java:
public class DoppeltVerketteteListe<T> {
  private class ListElem {
    T data;
    ListElem next;
    ListElem prev;
    public ListElem(T data) {
      this.data = data;
    }
  }
  private ListElem head;
  private ListElem tail;
  public Liste() {
    head = null;
    tail = null;
  }
  public void add(T data, int i) {
    ListElem newElem = new ListElem(data);
    //leere Liste, kann nach Aufgabenstellung auch weggelassen werden
    if(head == null) {
      head = newElem;
      tail = newElem;
    }
    //Liste hat mind. 1 Element
    else {
      ListElem current = head;
      int currentIdx = 0;
      while(current.next != null && currentIdx < i) {
        current = current.next;
        currentIdx++;
      }
      //i <= Listenlaenge
      if(currentIdx >= i) {
        newElem.next = current;
        newElem.prev = current.prev;
        newElem.next.prev = newElem;
        if(current == head)
          head = newElem;
        else
          newElem.prev.next = newElem;
      }
      //i > Listenlaenge
      else {
        newElem.prev = current;
        newElem.prev.next = newElem;
        tail = newElem;
      }
    }
  }
}
 
Es soll ja einen zeiger darstellen aber ich verstehe auch nicht so recht woher dieses Mysteriöse current jetzt weiss wer sein vorgänger und wer sein nachfolger ist aber das habe ich mal einfach so als fakt hingenommen ...

Braucht man nicht hinnehmen. Das ergibt sich direkt aus dem Code. "current" ist definiert als eine Variable vom Typ "ListElem". Und die Definition von "ListElem" am Anfang der Klasse zeigt, dass alle "ListElem"s ein "next" und "prev" haben. Somit hat auch "current" einen Vorgänge und Nachfolger.

Also wenn current kein Objekt ist was ists dann ?!

"current" ist selbstverständlich ein Objekt. Aber alle Objekt in Java sind als Referenz implementiert. Das ist mit Zeiger gemeint. Wenn du den Wert von "head" an die Variable "current" zuweist, wird nicht das ganze Objekt im Speicher kopiert sondern es wird nur die Adresse, die angibt, wo das Objekt im Hauptspeicher wohnt, kopiert. Die Anfertigung einer vollständigen Kopie eines Objekts nennt sich in Java "clonen". Es gibt nur wenig Objekte, für die das geht. Und die, für die das geht, implementieren das Interface Cloneable.
 

Zurück
Oben