# verkettete Liste - invertieren



## gutenacht-steph (5. Apr 2010)

Hallo,

ich bräuchte Hilfe beim invertieren von meiner verketteten Liste.

Ich hab mir die Standardmethoden geschrieben, wie 
vorne Einketten, hinten Einketten, an Position löschen, Position finden, ausgeben.

Nun fehlt mir aber noch die gute alte Inverse.

Gemeint ist damit, dass ich die Kette einfach umdrehe, also aus den Werten 1 - 2 - 3
nach der Inversion eine 3 - 2 - 1 wird. Der Anfang soll nun also auf 3, statt 1 zeigen und 
die 1 auf das Ende schauen.

Das hier ist mein Code:


```
public void invertieren(){
		  Element e = anfang.nElement;      // n.Element zeigt immer auf d. nächste Element
		  Element c = e;                          // e ist d. erste Element. c ist Puffervariable,um später
		  Element h = null;                       // die 1 dann auf das Ende zeigen zu lassen
		  Element q  = null;
		  
		  while(e.nElement != null){
			  q = e.nElement;               // q ist das Element das n. e kommt.
			  h=e;                              
			  e=e.nElement;                 // e ist Schleifenvariable
			  q.nElement=h;
			
		  }
		  
		  anfang.nElement = e;               // der Anfang soll nun wieder auf e zeigen
		  c = ende;                              // c enthält ja Adresse vom ehemals ersten Element..
	}
```

Wenn ich das Programm debugge, springt e vom ersten Element zum zweiten (so wie es sein soll), danach aber wieder zum ersten zurück. Es kommt dabei immer eine Endlosschleife raus.

Bzw. wenn ich die Elemente 1 - 2 - 3 in der Liste habe und mit println mir den Wert von e ausgeben möchte: 21212121212121.....................21212121212121.........212121

Hoffentlich könnt ihr mir Helfen, würde mich ziemlich freuen, vorallem weil ich einige Zeit ins darüber
nachdenken gesteckt habe, aber ich einfach auf nichts brauchbares stoße.. fuck


----------



## New_User_20 (5. Apr 2010)

Hi,
also am einfachsten ist das invertieren natürlich über einen Stack indem du alle Elemente auf den Stack legst und dann die Liste neu erzeugst, deine Schleife führt zu einer Endlosschleife, da du immer 1 Element wegnimmst und es dann als übernächstes wieder anfügst, also wird die Abbruchbedingung nie erreicht. Du benötigst also zunächst einen weiteren Zeiger auf das letzte Element deiner Liste und fügst dann alle Elemente an diesen Zeiger an (jeweils das nächste Element immer an den Zeiger des letzten Elements), die Abbruchbedinung ist dann erreicht, sobald du beim durchlauf das letzte Element (auf das du den Zeiger gesetzt hast) erreicht hast. Hoffe es ist nicht zu kompliziert erklärt


----------



## gutenacht-steph (6. Apr 2010)

Hallo und guten Abend.

Danke, vielen Dank. Du hast mich auf den richtigen Weg gelotst, Luke .
Verdammt, ich hab mir selber noch gefährliche Steine in den Weg gelegt, die mich echt etwas genervt haben (hab z.B. in meinem neuen Code die Methode anzahlElemente() [sagt einem wieviel Elemente die Liste hat] als Schleifenbedingung eingebaut, statt einem normalen integer. Jetzt wurde das Biest andauernd aufgerufen und während dem invertieren verändert, so dass nur Mist dabei rausgekommen ist).

Aber der gute Alte Debugger hat mich wieder zusammengeflickt. Echt, ohne den hätte ich es nie gepackt.

Super, jetzt klappt es, yeeehaw


----------

