Einfach verkettete Liste Element an bestimmter Position einfügen

Shantox

Mitglied
Hallo,
Java:
public class VerketteteListe<T> implements List<T> {
     protected T element;   //Referenz auf aktuelles Listenelement
     protected VerketteteListe<T> rest;   //Rest der Liste, oder null falls das aktuelle Element das letzte ist.
     public VerketteteListe(T element) {
          if (element == null) throw new NullPointerException();
          this.element = element;
     }
      public VerketteteListe(T... elemente) {
          if (elemente == null) throw new NullPointerException();
          if (elemente.length == 0) throw new IllegalArgumentException();
          for (T t : elemente) {
               if (element == null) {
                 element = t;
               }
               else {
                   add(t);
                }
             }
          }
     @Override
     public boolean add(T e) {
        if (e == null) throw new NullPointerException();
        if (rest == null) {
            rest = new VerketteteListe<T>(e);
            return true;
         }
        else {
            return rest.add(e);
           }
       }
    @Override
     public void add(int index, T e) {
         if (index == 0) {
              throw new UnsupportedOperationException(
                "Kann nicht als erstes Element einfuegen.");
              }
       // TODO
       }
@Override
     public void clear() {
        if (rest != null) {
        rest.clear();
        }
       rest = null;
       element = null;
      }
@Override
     public T get(int index) {
         if (index < 0) throw new IndexOutOfBoundsException();
        if (index == 0) return element;
        if (rest == null) throw new IndexOutOfBoundsException();
        return rest.get(index-1);
    }
@Override
    public int size() {
        if (rest == null) return 1;
        else return rest.size() + 1;
    }

Das hier habe ich alles gegeben und noch weitere Methoden, die jedoch irrelevant sind. Meine Aufgabe ist es, an der mit TODO markierten Stelle, die Methode zu vervollständigen. Ich muss ein neues Element e an Position index einfügen. Ich darf nur Änderungen an der Methode vornehmen und keine weiteren Variablen usw. einführen. Ich muss zugeben, ich bin kein großer Fan von verketteten Listen. Wie das mit Arrays klappen würde würde ich verstehen.
Kann mir jemand ein bisschen helfen? Ich stehe grad auf dem Schlauch. Ich hab das Gefühl das ich irgendwas mit der Methode get machen muss oder?
 
Ja und nein, wenn du nur das machst, überschreibst du den Eintrag, der dort stand, allerdings soll ja ein zusätzlicher Eintrag dort eingefügt werden
 
rest.element = e wäre ja der neue Eintrag auf Position 1. Den alten Eintrag müsste ich dann auf Position 2 verschieben. Wie realisiert man das bei Listen? Ich kann ja nicht inkrementieren.
 
rest und element sind unterschiedliche Datentypen, das klappt also nicht 😉
Es fehlt immer noch, das ein zusätzliches Element eingefügt wird, es muss ja ein zusätzliches Listen-Element geben, in diesem Fall VerketteteListe
 
Das geht auch in die richtige Richtung, da ist aber noch ein bisschen was falsch...

Warum übergibst du element dem Konstruktor? Element ist doch der Wert an der aktuellen Position, und hat mit der nächsten nichts zu tun?
 
Zuletzt bearbeitet:
Ich habe mir gedacht, dass wenn ich element im Konstruktur übergebe, dass element dann an zweiter Position stehen wird. Aber da du das so sagst, muss ich anstatt element dem Konstruktur wahrscheinlich e übergeben richtig? Aber dann ist wiederum rest.element = e; falsch.
 
rest.element = e ist dann auch überflüssig, stattdessen musst du den alten rest der Liste mit dem neuen Element verbinden
 
Generelles Vorgehen (Annahme: das bisherige Element an der Position "index" soll durch ein neues ersetzt werden und die bisherigen rutschen um eins weiter):

  • du musst zunächst einmal zu der Position navigieren (index) an der du ein Element einfügen willst. Das kannst du zum Beispiel rekursiv machen indem du die Methode für den Nachfolger des aktuellen Elementes wieder mit dem um 1 dekrementierten Index aufrufst. Wenn der Index == 1 ist weisst du: das nächste Listenelement ist das welches ersetzt werden soll.
  • Ersetzen: ein neues Listenelement erzeugen, in dieses für rest das aktuelle rest eintragen und für element den übergebenen Wert. im aktuellen rest trägst du dann das neue Listenelement ein. Ein Spezialfall ist noch wenn beim durchnavigieren index == 1 wird und rest == null. Dann ist das das Ende der Liste und du hängst einach an. Dafür hast du ja schon eine Methode.
Jetzt versuch mal das in Code umzusetzen.
 
mal ne andere Frage, was ich nicht verstehe:
warum muss er nicht mit "throws" im Methodenkopf angeben, dass seine Methoden Exceptions schmeißen?
Danke, LG
 
okay, und diese müssen dann nicht weitergegeben werden, also braucht er kein throws.
sind die exceptions checked und werden weitergereicht, dann throws im Methodenschädel?
danke
 

Zurück
Oben