# Arbeiten mit Lists



## Alan001 (3. Mai 2015)

Hallo! Ich muss eine rotate() Methode schreiben, die je drei Elemente in einer LinkedList rotiert. Aus " a b c d e f g h i j k " wird also " c a b f d e i g h j k ". Ich habe einen Code aber leider spinnt der rum.. Ich verzweifle langsam da ich seit zwei Tagen dran sitze. Das Problem ist das Erstellen des neuen Zeigers hinter der ersten Dreiergruppe. 
Bin ein absoluter Anfänger. Muss es einmal Iterativ und einmal rekusriv machen. Mein Code:


```
public void rotateTriplesIter() {    
    int count = 0;
    ListItem<T> temp = first;
    ListItem<T> temp2 = null;
    ListItem<T> buffer = null;


    
    for (ListItem<T> p = first; p != null; p = p.next) {
        
        count = count + 1;
    }
    
    for (int i = 0; i <= count; i++){
        
        if (i % 3 == 0){
            
            if ( temp != null && temp.next != null && temp.next.next != null) {
            
            temp2 = temp.next;
            buffer = temp2.next;
           temp2.next = buffer.next;
            buffer.next = temp;
            
            }
            
        }


    }
    
}
```

Wenn ich folgendes durchlaufen lasse: ListItem[Ada, Bernhard, Charles, Domian, Eduard, Ferdinant, Yasen, Zora]

Erhalte ich: ListItem[Ada, Bernhard, Ferdinant, Yasen, Zora]


----------



## fhoffmann (3. Mai 2015)

Mich wundern deine Bezeichnungen; warum nennst du die Variablen "temp", "temp2" und "buffer"?
Klarer fände ich die Namen "temp1", "temp2" und "temp3" - außerdem würde ich noch eine Variable "temp4" hinzufügen, die auf das nächste "temp1" (also hinter die erste Dreiergruppe) verweist.

So schön Computer sein mögen, beim Lösen derartiger Aufgaben hat mit immer ein Blatt Papier geholfen, auf dem ich aufmale, welche Variable gerade auf welchen Wert verweist.


----------



## Alan001 (3. Mai 2015)

So, ich habe eine zeile hinzugefügt, die immer zur nächsten Dreiergruppe springt. Davor hat mir das modulo i nämlich nichts gebracht.


```
public void rotateTriplesIter() {
    
    int count = 0;
    ListItem<T> temp = first;
    ListItem<T> temp2 = null;
    ListItem<T> temp3 = null;
    ListItem<T> temp4 = null;


    
    for (ListItem<T> p = first; p != null; p = p.next) {
        
        count = count + 1;
    }
    
    for (int i = 0; i <= count; i++){
        
        if (i % 3 == 0){
            
            if ( temp != null && temp.next != null && temp.next.next != null) {
            
            temp2 = temp.next;
            temp3 = temp2.next;
            temp4 = temp3.next;
            temp3.next = temp;
            
            }
            
        }     
        if (temp.next != null)
            temp = temp.next;


    }
    
}
```


Aufgezeichnet habe ich es bereits. 
Mein aktueller Code ist das. Mit temp gehe ich die Elemente durch. i teilt es in Dreiergruppen. Innerhalb dieser Gruppen dann mache ich folgendes:


Nehmen wir a b und c. b wird in temp2 gespeichert und c in buffer. next von b muss ja auf den Nächsten von c zeigen, zeigt also auf buffer.next. Und da C auf den alten Anfang muss, zeigt buffer.next auf a, da a ja das erste Element war. Nun ist also c das erste Element. Was ist hier falsch?


----------

