# DoubleLinkedList



## acr1904 (8. Dez 2017)

Hallo zusammen,

für mein Studium muss ich eine doubleLinkedList Implementierung vervöllständigen. Der Prof hat uns hierfür einen Code zusammengestellt indem wir die Methoden, die mit TODO gekennzeichnet wurden vervollständigen sollen.

Folgender Code hat er uns bereit gestellt:



public class MyDoubleLinkedListEmpty {


  private static class Node<T> {
    Node<T> next;   // Nächster Knoten (oder null)       

    Node<T> prev;   // Vorheriger Knoten (oder null)

    T element;      // Referenz auf Datenelement

    public Node(T el) {
      element = el;
    }

   }
  /**
   * Anzahl der Elemente in Liste // wie viele dinge sind in gesamter liste
   */
  private int size = 0;

 // Referenz auf erstes Element (oder null)

  private Node<T> start = null;

  /**
   * Liefert Node-Objekt an Position pos
   */
  private Node<T> getNodeAt(int pos) {
    if (pos >= size) throw new IllegalArgumentException();
    Node<T> n = start;

    for (;pos>0; pos--) {
      n = n.next;
    }

    return n;
  }

  /**
   * Liefert Node-Objekt an mit Element el.
   * Falls Element nicht in Liste: Rueckgabewert null
   */
  private Node<T> getNodeWithElement(T el) {
    Node<T> n = start;

    do {
      if (n.element == el) return n;
      n = n.next;
    } while (n != null);

    return null;
  }


  /**
   * Fuege Element an Ende der Liste an
   */
  public void add(T element) {


  }

  /**
   * Fuege Element an Position pos (1. Element = Position 0) in Liste ein
   */
  public void add(int pos, T element) {
    // TODO
  }

  /**
   * Loesche Liste
   */
  public void clear() {
    // TODO
  }

  /**
   * Gibt true zurueck, wenn Liste das Element enthält
   */
  public boolean contains(T element) {
     if (element == n.element)
    return false; // TODO
  }

  /**
   * Gibt Element an Position pos zurück. Die Liste bleibt unveraendert.
   */
  public T get(int pos) {
    return null; // TODO
  }

  /**
   * Ist die Liste leer?
   */
  public boolean isEmpty() {
//TODO
    return false;
  }

  /**
   * Entfernt Knoten n aus Liste
   */
  private T removeNode(Node<T> n) {
    return null; // TODO
  }



  /**
   * Entfernt Element element aus Liste. Falls Element in Liste gewesen: Rückgabewert true
   */  
  public boolean remove(T element) {
     if (contains()) {
         return true;
    return false;   // TODO
  }

  /**
   * Entfernt Element an Position pos aus Liste. Gibt Referenz auf entferntes Element zurück
   */  
  public T remove(int pos) {
    return null;   // TODO

  }

  /**
   * Anzahl der Elemente in Liste
   */
  public int size() {
    return 0;   // TODO
  }
}
}


Nun bin ich schon leider bei der ersten Methode am verzweifeln. Hat jemand eine Ahnung wieso hier ein Node<T> n = start implementiert wird und warum die int POS variable runterzählen soll und dabei n = n.next; sein soll!? Vorallem war mir nicht klar, dass diese Syntax überhaupt richtig ist mit "n = n.next" was bezweckt diese Zeile?

Ich bin neu hier und hoffe darauf, dass mir hier  jemand helfen kann. Vielen Dank schon mal


----------



## acr1904 (8. Dez 2017)

hm sorry weiß noch nicht wie das mit den Code Passagen hier im Forum funktioniert?!


----------



## Blender3D (8. Dez 2017)

```
public class MyDoubleLinkedListEmpty {


private static class Node<T> {
Node<T> next; // Nächster Knoten (oder null)

Node<T> prev; // Vorheriger Knoten (oder null)

T element; // Referenz auf Datenelement

public Node(T el) {
element = el;
}

}
/**
* Anzahl der Elemente in Liste // wie viele dinge sind in gesamter liste
*/
private int size = 0;

// Referenz auf erstes Element (oder null)

private Node<T> start = null;

/**
* Liefert Node-Objekt an Position pos
*/
private Node<T> getNodeAt(int pos) {
if (pos >= size) throw new IllegalArgumentException();
Node<T> n = start;

for (;pos>0; pos--) {
n = n.next;
}

return n;
}

/**
* Liefert Node-Objekt an mit Element el.
* Falls Element nicht in Liste: Rueckgabewert null
*/
private Node<T> getNodeWithElement(T el) {
Node<T> n = start;

do {
if (n.element == el) return n;
n = n.next;
} while (n != null);

return null;
}


/**
* Fuege Element an Ende der Liste an
*/
public void add(T element) {


}

/**
* Fuege Element an Position pos (1. Element = Position 0) in Liste ein
*/
public void add(int pos, T element) {
// TODO
}

/**
* Loesche Liste
*/
public void clear() {
// TODO
}

/**
* Gibt true zurueck, wenn Liste das Element enthält
*/
public boolean contains(T element) {
if (element == n.element)
return false; // TODO
}

/**
* Gibt Element an Position pos zurück. Die Liste bleibt unveraendert.
*/
public T get(int pos) {
return null; // TODO
}

/**
* Ist die Liste leer?
*/
public boolean isEmpty() {
//TODO
return false;
}

/**
* Entfernt Knoten n aus Liste
*/
private T removeNode(Node<T> n) {
return null; // TODO
}



/**
* Entfernt Element element aus Liste. Falls Element in Liste gewesen: Rückgabewert true
*/
public boolean remove(T element) {
if (contains()) {
return true;
return false; // TODO
}

/**
* Entfernt Element an Position pos aus Liste. Gibt Referenz auf entferntes Element zurück
*/
public T remove(int pos) {
return null; // TODO

}

/**
* Anzahl der Elemente in Liste
*/
public int size() {
return 0; // TODO
}
}
}
```


----------



## Javinner (8. Dez 2017)

@acr1904 
http://openbook.rheinwerk-verlag.de/javainsel9/javainsel_13_003.htm


acr1904 hat gesagt.:


> hm sorry weiß noch nicht wie das mit den Code Passagen hier im Forum funktioniert?!


https://www.java-forum.org/help/bb-codes


----------



## Manuel.R (9. Dez 2017)

Google kennt die Antwort und liefert eine/mehrere gute Beschreibungen dazu


----------



## acr1904 (9. Dez 2017)

Manuel.R hat gesagt.:


> Google kennt die Antwort und liefert eine/mehrere gute Beschreibungen dazu



Google hat mir genauso wenig geholfen wie du


----------



## Manuel.R (10. Dez 2017)

acr1904 hat gesagt.:


> Google hat mir genauso wenig geholfen wie du


Überleg dir, ob das Studium das richtige für dich ist!!!


----------



## acr1904 (10. Dez 2017)

Manuel.R hat gesagt.:


> Überleg dir, ob das Studium das richtige für dich ist!!!



Deine Kommentare grenzen an Dummheit. Ich habe nach Hilfe für diese Aufgabe gefragt und nicht nach Karrieretipps.


----------



## Manuel.R (10. Dez 2017)

Aber nur grenzen:


```
/**
     * Ist die Liste leer?
     */
    public boolean isEmpty() {
        if(size==0){
            return true;
        }
        return false;
    }
```

eine sehr einfache Form, um festzustellen, ob die Liste leer ist, wäre zu prüfen, wie groß sie ist.
Ist sie 0, dann sollte sie leer sein....


----------



## Javinner (10. Dez 2017)

@acr1904 
Was hast du bis jetzt lösen können?


----------



## Manuel.R (10. Dez 2017)

sorry, nur das prüfen ob sie leer ist. sonntags ist nicht mein schneller tag.

sorry war nicht für mich....


----------



## acr1904 (10. Dez 2017)

Di


Manuel.R hat gesagt.:


> Aber nur grenzen:
> 
> 
> ```
> ...


Diese einfache Form habe ich implementiert. Wie ich oben bereits beschrieben habe geht es um andere Methoden. Vielen Dank für deine nicht vorhandene Hilfe und jetzt tu mir den Gefallen und schreibe bei anderen Beiträgen wie sehr Google doch hilft.


----------



## acr1904 (10. Dez 2017)

Javinner hat gesagt.:


> @acr1904
> Was hast du bis jetzt lösen können?


Nur die einfachen Methoden wie clear und is empty...mir fehlen die Node setzen Methoden


----------



## Manuel.R (10. Dez 2017)

acr1904 hat gesagt.:


> Di
> 
> Diese einfache Form habe ich implementiert. Wie ich oben bereits beschrieben habe geht es um andere Methoden. Vielen Dank für deine nicht vorhandene Hilfe und jetzt tu mir den Gefallen und schreibe bei anderen Beiträgen wie sehr Google doch hilft.



das ist ja frech....

```
/**
     * Fuege Element an Ende der Liste an
     */
    public void add(T element) {
        //create Node with given Element
        Node<T> nodeWithGivenElement = new Node(element);
        //if size is empty put it on position "start"
        if(size==0){
            start=nodeWithGivenElement;
        }else{
            //Get last Node of List (list starts with 0)
            Node<T> endNode = getNodeAt(size-1);
            //put relations on it....
            //ToDo
        }   
    }
```

ich habe die Methode mit dem einfachen Hinzufügen begonnen. 
Vielleicht kannst  du damit einfach selbst fortfahren....


----------



## Javinner (10. Dez 2017)

An welcher Methode sitzt du gerade?


----------



## Manuel.R (10. Dez 2017)

wer?


----------



## Javinner (10. Dez 2017)

@Manuel.R 
Wie es scheint, brauchst du keine Hilfestellung  daher war Fragesteller gemeint


----------



## Manuel.R (10. Dez 2017)

ich muss hier leider abbrechen und kann nicht alles weiter machen. ich hoffe der denkanstoß reicht erstmal.

das einfügen an einer bestimmten position verläuft ähnlich. wichtig sind die referenzen und das prüfen der liste.


----------



## acr1904 (10. Dez 2017)

Sitze momentan an der einfachen Hinzufügen Methode dran. 

habe folgenden Code dort implementiert aber er scheint nicht zu funktionieren, wenn ich die Liste an der Stelle 0 mit der Methode getNodeAT(0) ausrufe kommt nur "*packagename*.DoubleLinkedList$Node@7852e922"


```
public void add(T element) {

       Node<T> node = new Node<T>(element);

       if (size == 0) {
           start = node;

       } else {
           Node<T> nextNode = start;
           Node <T> lastNode = start;
           
           while ( nextNode.next != null){
           nextNode = nextNode.next;
       lastNode = nextNode.prev;
       }
       nextNode.next = node;
       nextNode.prev = lastNode;
   }
       size ++;
   }
```

weiß jemand wo der Fehler liegt?


----------



## acr1904 (10. Dez 2017)

Manuel.R hat gesagt.:


> ich habe die Methode mit dem einfachen Hinzufügen begonnen.
> Vielleicht kannst  du damit einfach selbst fortfahren....



oha das ist aber ja auch ne echt gute Idee mit dem Aufruf der Methode getNodeAt mit size - 1 

Vielleicht versuche ich es doch mit dieser Variante


----------



## acr1904 (10. Dez 2017)

acr1904 hat gesagt.:


> oha das ist aber ja auch ne echt gute Idee mit dem Aufruf der Methode getNodeAt mit size - 1
> 
> Vielleicht versuche ich es doch mit dieser Variante


wobei ich da einfach nicht drauf komme wie ich eine Referenz zum previous Node mache...die Referenz zum nächsten wäre ja Null da es das Letzte ist. Aber es gibt ja noch keine Referenz auf den vorherigen Node, also müsste ich vielleicht vom start aus bis zum letzten alle Nodes durchlaufen lassen oder?


----------



## Meniskusschaden (10. Dez 2017)

Nein. Jedenfalls musst du es nicht selbst machen, weil die Methode `getNodeAt()` es bereits für dich erledigt, wenn du dir von ihr den aktuell letzten Knoten liefern lässt.


----------



## Manuel.R (11. Dez 2017)

acr1904 hat gesagt.:


> Sitze momentan an der einfachen Hinzufügen Methode dran.
> 
> habe folgenden Code dort implementiert aber er scheint nicht zu funktionieren, wenn ich die Liste an der Stelle 0 mit der Methode getNodeAT(0) ausrufe kommt nur "*packagename*.DoubleLinkedList$Node@7852e922"
> 
> ...



....wenn ich die Liste an der Stelle 0 mit der Methode getNodeAT(0) ausrufe kommt nur "*packagename*.DoubleLinkedList$Node@7852e922" heißt: er liefert den Knoten von Stelle 0 der Liste. Das was du da siehst, ist die Ausgabe der toString Methode der Klasse Node. Sie wurde nicht verändert und daher von der Klasse Object übernommen. Hier findest du die API zu Java 8.  Das Ergebnis der Ausgabe ist: 

```
getClass().getName() + '@' + Integer.toHexString(hashCode())
```


----------



## acr1904 (11. Dez 2017)

Meniskusschaden hat gesagt.:


> Nein. Jedenfalls musst du es nicht selbst machen, weil die Methode `getNodeAt()` es bereits für dich erledigt, wenn du dir von ihr den aktuell letzten Knoten liefern lässt.



Angenommen es sind vier Knoten in der Liste, ich könnte ja mit der getNodeAt Methode mit size -2 auf den vorletzten zugreifen aber wie soll ich da eine Referenz auf den 2. und den ersten machen mit der prev und next Variable...das ist mein Problem...wenn nur 2 Knoten drin sind ist es ja kein Problem aber bei mehreren komm ich einfach nicht drauf...


----------



## acr1904 (11. Dez 2017)

Manuel.R hat gesagt.:


> ....wenn ich die Liste an der Stelle 0 mit der Methode getNodeAT(0) ausrufe kommt nur "*packagename*.DoubleLinkedList$Node@7852e922" heißt: er liefert den Knoten von Stelle 0 der Liste. Das was du da siehst, ist die Ausgabe der toString Methode der Klasse Node. Sie wurde nicht verändert und daher von der Klasse Object übernommen. Hier findest du die API zu Java 8.  Das Ergebnis der Ausgabe ist:
> 
> ```
> getClass().getName() + '@' + Integer.toHexString(hashCode())
> ```



d.H. ja dass es doch passt und die Methode mir den Hinzugefügten Knoten ausgibt, nur dass der Knoten noch ein Objekt ist und nicht das Element zurück gegeben wird oder?


----------



## Meniskusschaden (11. Dez 2017)

Nein, der neue Knoten wurde noch gar nicht hinzugefügt. Die Methode gibt den Knoten zurück, der sich aktuell an der angegebenen Position befindet. Wenn du dir damit den letzten Knoten der Liste liefern lässt, kannst du den neuen daran anhängen.


----------



## Manuel.R (11. Dez 2017)

Implementiere doch einfach die Liste zum Testen der Funktionen. Das heißt:
1.) Baue eine neue Klasse mit Main-Methode
2.) Erstelle ein MyDoubleLinkedListEmpty Objekt und Teste es.

```
public Class Main {

public void main (String args[]){

MyDoubleLinkedListEmpty<String> list = new MyDoubleLinkedListEmpty();

//füge Daten zur Liste
list.add("Java ist toll");
list.add("Ich kann nicht genug davon bekommen");
//ToDo für dich, toString vielleicht anpassen um sprechende Ausgaben zu bekommen

}

}
```


----------



## acr1904 (11. Dez 2017)

Meniskusschaden hat gesagt.:


> Nein, der neue Knoten wurde noch gar nicht hinzugefügt. Die Methode gibt den Knoten zurück, der sich aktuell an der angegebenen Position befindet. Wenn du dir damit den letzten Knoten der Liste liefern lässt, kannst du den neuen daran anhängen.




Ahhh ich verstehe. Du meinst das dann so oder? :


```
} else {
       
           Node<T> endNode = getNodeAt(size-1);
           endNode.next = node;
           node.prev = endNode;
```


----------



## acr1904 (11. Dez 2017)

Manuel.R hat gesagt.:


> Implementiere doch einfach die Liste zum Testen der Funktionen. Das heißt:
> 1.) Baue eine neue Klasse mit Main-Methode
> 2.) Erstelle ein MyDoubleLinkedListEmpty Objekt und Teste es.
> 
> ...


Ja das habe ich so gemacht nur wie ich schon sagte hatte ich da das Problem dass kein Element ausgegeben wurde, aber ja dafür muss ich wohl die toString Methode noch ändern


----------



## Manuel.R (11. Dez 2017)

acr1904 hat gesagt.:


> Ahhh ich verstehe. Du meinst das dann so oder? :
> 
> 
> ```
> ...


sieht auf den ersten Blick nicht verkehrt aus.


----------



## Manuel.R (11. Dez 2017)

und mit dem Einfügen an Position x ist dann nicht sehr viel anders.
 ein paar stolperfallen sind vorher zu prüfen.


----------



## Manuel.R (11. Dez 2017)

hups
vergessen zu sagen. nach dem einfügen muss die anzahl "size" erhöht werden (size++);


----------



## acr1904 (11. Dez 2017)

Manuel.R hat gesagt.:


> hups
> vergessen zu sagen. nach dem einfügen muss die anzahl "size" erhöht werden (size++);


daran habe ich gedacht, vielen dank ich versuch mein Glück nochmal und melde mich bestimmt morgen nochmal


----------

