Neuer Instanz automatisiert einen Namen zuweisen

Du musst dir "next" in der Schleife auch merken. So in etwas sollte die "get(int i)" Methode aussehen.

Java:
public T get(int i) {
	if(i >= this.size)
		throw new ArrayIndexOutOfBoundsException("Die Liste ist nicht so groß!");
	
	//First ist immer dein Start-Element
	ElementKlasse tmp = this.first;
	
	while(i-- > 0) {
		tmp = tmp.getNext();
	}
	
	return tmp.getValue();
}

Neben "first" bietet sich bei einer doppelt verketteten Liste auch noch "last" an, um je nach Index von hinten anzufangen.

PS: Oder muss ich alle Elemente immer über das eine definierte Anfangselement ansteuern und dann eben n mal die next-Methode aufrufen, um zu Element n-1 zu kommen? Dann wäre jede Operation inmitten der Liste aber wirklich unschön...

Deshalb steht man auch je nach Anwendungsfall immer vor der Frage, ob man LinkedList oder ArrayList verwendet. Wir hatten dazu mal eine Übungsaufgabe, in der wir beide gegenüberstellen sollten und die Zeit messen. Z.b. eine Millionen Element immer am Ende einfügen, oder eine Millionen Mal einen Index Zugriff machen. Da merkt man ganz schnell, wo die Listen Ihre Schwächen haben.
 
Also wenn ich beispielsweise ein Element zwischen Element 3 und Element 4 einfügen möchte, dann gehe ich vom Startelement vor, bis ich bei Element 3 bin. Dann Speichere ich den das next-Element zwischen und setzte es für Element 3 auf das neue Element. Dann gehe ich zu dem neuen Element (jetzt das next von Element 3) und gebe dort das zwischengespeicherte als next an.

Bei einer doppelt verketteten Liste muss ich einfach dann noch ein "davor" abspeichern und beim einfügen mehr zwischenspeichern und neu vergeben.

Und ich muss zwischenspeichern, bei welchem Element der Liste ich gerade bin. Oder fange ich immer wieder beim ersten Element an?
 
Also wenn ich beispielsweise ein Element zwischen Element 3 und Element 4 einfügen möchte, dann gehe ich vom Startelement vor, bis ich bei Element 3 bin. Dann Speichere ich den das next-Element zwischen und setzte es für Element 3 auf das neue Element. Dann gehe ich zu dem neuen Element (jetzt das next von Element 3) und gebe dort das zwischengespeicherte als next an.

Bei einer doppelt verketteten Liste muss ich einfach dann noch ein "davor" abspeichern und beim einfügen mehr zwischenspeichern und neu vergeben.

Genau.

Und ich muss zwischenspeichern, bei welchem Element der Liste ich gerade bin. Oder fange ich immer wieder beim ersten Element an?

Bei einfach verketteten sollte man immer wieder vorne anfangen.
Wenn man nur eines in der Mitte kennt, kommt man zu den vorhergehenden ja nicht mehr zurück.

Bei doppelt verketteten kann man es sich aussuchen
Wenn du immer das aktuelle Element statt dem Anfang speicherst, musst du aber noch irgendwo speichern das wievielte Element das ist (wenn du dann zB das insgesamt vierte Element brauchst, musst du ja herausfinden, wieviel vor/zurück du von der aktuellen Position aus gehen musst)

Mit dem aktuellen Element bekommst du vor allem bei Schleifen, in denen du jedes Element durchgehst, bessere Performance. Du musst dann ja immer nur eins weitergehen, statt vom Anfang jedesmal neu loszuzählen.

Eine Möglichkeit, das auch bei einfach verketteten Listen zu machen, wäre, dass das letzte Element als next wieder das erste hat (also sozusagen im Kreis geht).

Gruß
 
Vielen Dank nochmal für eure Hilfe. Dank euch konnte ich das Ganze wie gewünscht umsetzten. :)
Ihr habt mir geholfen ein paar Denkfehler zu korrigieren! ;)
 
Zurück