# Einfach verkettete Liste Element an bestimmter Position einfügen



## Shantox (6. Mai 2017)

Hallo,

```
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?


----------



## mrBrown (6. Mai 2017)

Hast du denn eine Idee, wie die Methode für index=1 aussehen müsste?


----------



## Shantox (6. Mai 2017)

Nicht wirklich. Ich bin es gewohnt, bei Listen eine Referenz auf das nächste Element zu haben, die mir hier aber fehlt..


----------



## mrBrown (6. Mai 2017)

Nein, `rest` ist doch die Referenz auf das nächste Objekt


----------



## Xyz1 (6. Mai 2017)

In `add` steht doch schon, was zu tun ist. Sollt ihr das rekursiv oder iterativ machen?


----------



## Shantox (6. Mai 2017)

Dann bei index 1: rest.element = e oder nicht?


----------



## mrBrown (6. Mai 2017)

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


----------



## Shantox (6. Mai 2017)

@DerWissende Das wäre egal, wie man das machen würde


----------



## Shantox (6. Mai 2017)

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.


----------



## mrBrown (6. Mai 2017)

Mal es dir am besten mal auf Papier auf, bei verketteten Listen hilft das meist


----------



## Shantox (6. Mai 2017)

rest = element;
rest.element = e; ?


----------



## mrBrown (6. Mai 2017)

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`


----------



## Shantox (6. Mai 2017)

Sorry, ich sitze grad komplett auf den Schlauch :/


----------



## mrBrown (6. Mai 2017)

Deshalb: Mal es dir mal auf Papier auf


----------



## Shantox (6. Mai 2017)

Muss ich mithilfe des Konstruktors das neue Element einfügen?


----------



## mrBrown (6. Mai 2017)

Das geht in die richtige Richtung


----------



## Shantox (6. Mai 2017)

VerketteteListe rest = new VerketteteListe(element);
rest.element = e;


----------



## mrBrown (6. Mai 2017)

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?


----------



## Shantox (6. Mai 2017)

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.


----------



## mrBrown (6. Mai 2017)

rest.element = e ist dann auch überflüssig, stattdessen musst du den alten rest der Liste mit dem neuen Element verbinden


----------



## JStein52 (7. Mai 2017)

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.


----------



## Gelöschtes Mitglied 54019 (7. Mai 2017)

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


----------



## mrBrown (7. Mai 2017)

Die Exceptions erben von RuntimeException, damit sind die Unchecked und müssen nicht angegeben werden


----------



## Gelöschtes Mitglied 54019 (7. Mai 2017)

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


----------



## mrBrown (7. Mai 2017)

Weitergereicht werden alle, der Unterscheid zwischen Checked und Unchecked ist, das erstere explizit behandelt werden müssen, also entweder mit throws oder mit catch


----------

