Moin,
Ich muss eine per Parameter übergebene Variable aufsteigend sortiert in eine verkettete Liste einfügen. Da ich mir bei dem Thema schwer tue und das Internet leider kaum was zu verkettete Listen hat, suche ich hier Rat.
key ist ein Attribut der Klasse ObjectsWithKey wessen Objekt als Parameter übergeben wird. z ist das letzte Element
Meine Frage ist jetzt ob mein Ansatz richtig ist oder ob ich etwas vergessen habe?
für mich ist die Aufgabe nicht deutlich genug, kannst du da ausführlicher erklären, was gemacht werden muss.
was elemente in einer verkettete Listen hinzufügen angeht , hier ein beispiel:
Java:
publicclassTest{publicstaticvoidmain(String[] args){int[] array ={1,1,0,0};//array erstellenList<Integer> liste =newLinkedList<>();//liste erstellenfor(int item : array)//gehe die elemente in array durch
liste.add(item);//und fühge sie in der Liste ein}
für mich ist die Aufgabe nicht deutlich genug, kannst du da ausführlicher erklären, was gemacht werden muss.
was elemente in einer verkettete Listen hinzufügen angeht , hier ein beispiel:
Java:
publicclassTest{publicstaticvoidmain(String[] args){int[] array ={1,1,0,0};//array erstellenList<Integer> liste =newLinkedList<>();//liste erstellenfor(int item : array)//gehe die elemente in array durch
liste.add(item);//und fühge sie in der Liste ein}
publicclassListeimplementsDynamischeMenge{privateclassListenelement{ObjectWithKey data;Listenelement next;publicListenelement(){}publicListenelement(ObjectWithKey o){this.data = o;}publicStringtoString(){returnthis.data.toString();}}Listenelement head;Listenelement z;// generiert Struktur fuer leere ListepublicListe(){
head =newListenelement();
z =newListenelement();
head.data =null;
head.next = z;
z.data =null;
z.next = z;}// Ausgabe aller Elemente der Listepublicvoidprint(){Listenelement ele = head.next;while(ele != z){System.out.println(ele.data);
ele = ele.next;}}publicvoidinsert(ObjectWithKey o){int key = o.getKey();Listenelement ele = head.next;while(ele != z){if(key < ele.data.getKey()){Listenelement newEle =newListenelement();
newEle.data = o;
newEle.next = ele;break;}
ele = ele.next;}}}
Leider kann man bei verketteten Listen nicht ganz so vorgehen wie du es beschrieben hast, da diese Klassen meist selbst geschrieben sind und man die .add methoden selbst schreiben muss.Und bei meiner war ich mir unsicher - leider darf ich auch nicht die normalen Listen nehmen, da das alles Uni Vorgaben sind
Am besten wäre es, das einfach zu testen.
Ich glaube nicht, dass es vernünftig funktioniert, denn bereits beim Erzeugen einer leeren Liste entsteht eine seltsame Struktur: Nachfolger von head ist z und Nachfolger von z ist ebenfalls z. Es gibt dann also zwei Elemente, wobei das Zweite Nachfolger des Ersten und gleichzeitig zyklisch mit sich selbst verbunden ist. Das ist doch bestimmt nicht so gewollt.
Beim Versuch, das erste Element einzufügen, müsste hier
das Problem auftreten, dass du ele auf head.next setzt (also z), so dass die Bedingung der while-Schleife niemals erfüllt wird und somit auch nichts eingefügt wird.
Bei verketteten Listen finde ich es immer hilfreich, es mal auf dem Papier mit Kästchen aufzuzeichnen und die Operationen durch "Umhängen" von Pfeilen nachzuvollziehen.
Am besten wäre es, das einfach zu testen.
Ich glaube nicht, dass es vernünftig funktioniert, denn bereits beim Erzeugen einer leeren Liste entsteht eine seltsame Struktur: Nachfolger von head ist z und Nachfolger von z ist ebenfalls z. Es gibt dann also zwei Elemente, wobei das Zweite Nachfolger des Ersten und gleichzeitig zyklisch mit sich selbst verbunden ist. Das ist doch bestimmt nicht so gewollt.
Beim Versuch, das erste Element einzufügen, müsste hier
das Problem auftreten, dass du ele auf head.next setzt (also z), so dass die Bedingung der while-Schleife niemals erfüllt wird und somit auch nichts eingefügt wird.
Bei verketteten Listen finde ich es immer hilfreich, es mal auf dem Papier mit Kästchen aufzuzeichnen und die Operationen durch "Umhängen" von Pfeilen nachzuvollziehen.
Hallo, ja es gibt auch eine Nullpointer. Leider ist das Erzeugen der Liste so vorgegeben und darf auch nicht verändert werden. Ich habe jetzt noch folgenden Code hinzugefügt um im Falle eines leeren Heads diesen zu befüllen jedoch klappt das immer noch nicht.