DoubleLinkedList

acr1904

Mitglied
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:)
 

Blender3D

Top Contributor
Code:
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
}
}
}
 

Manuel.R

Bekanntes Mitglied
Aber nur grenzen:

Code:
    /**
     * 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....
 

acr1904

Mitglied
Di
Aber nur grenzen:

Code:
    /**
     * 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....
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.
 

Manuel.R

Bekanntes Mitglied
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....
Code:
    /**
     * 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....
 

Manuel.R

Bekanntes Mitglied
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

Mitglied
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"

Java:
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

Mitglied
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

Top Contributor
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

Bekanntes Mitglied
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"

Java:
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?

....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:
Code:
getClass().getName() + '@' + Integer.toHexString(hashCode())
 

acr1904

Mitglied
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

Mitglied
....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:
Code:
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

Top Contributor
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

Bekanntes Mitglied
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.
Code:
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

Mitglied
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? :

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

acr1904

Mitglied
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.
Code:
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

}

}
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
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N DoubleLinkedList ausgeben Allgemeine Java-Themen 19

Ähnliche Java Themen

Neue Themen


Oben