Doppelt verkettete Liste rückwärts ausgeben

Diskutiere Doppelt verkettete Liste rückwärts ausgeben im Java Basics - Anfänger-Themen Bereich.
A

Albi_2020

Hi,
ich habe folgende Aufgabe:
"Erweitern Sie die zweite Version der einfach verketteten Liste so, dass die Liste auch rückwärts ausgegeben werden kann. Erstellen Sie dazu eine entsprechende Methode, die sich rekursiv aufruft."

Aktuell kenne ich ja immer nur den Nachfolger. Um die Aufgabenstellung zu lösen, muss ich ja den einzelnen Listenelementen verklickern, wer ihre Vorgänger sind...allerdings habe ich aktuell keine Idee, wie ich das umsetzen kann. Eigentlich muss ja nur die Referenz vom vorherigen Element auf den Vorgänger gesetzt werden. Aber ich weiß nicht wie und wo ich die Referenz übergebe.

Java:
public class Listenelement {
    
    String daten;
    Listenelement naechster;
    

    void setDaten(String datenNeu) {
        daten = datenNeu;
        naechster = null;
    }
    
    Listenelement anhaengen(String datenNeu) {
            naechster = new Listenelement();
            naechster.setDaten(datenNeu);
            return naechster;
    }

  
    void ausgeben() {
        System.out.println(daten);
        if (naechster != null)
            naechster.ausgeben();
    }
}

public class Aufgabe {

    public static void main(String[] args) {
                        
        Listenelement listenAnfang = new Listenelement();
        
        listenAnfang.setDaten("Element 1");
        
        Listenelement listenEnde = listenAnfang;
        
        for (int element = 2; element < 20; element++) {
            listenEnde = listenEnde.anhaengen("Element " + element);
        }       

        listenAnfang.ausgeben();
    }

}
 
J

JustNobody

Schau Dir doch einfach einmal Deine Methode ausgeben im Detail an:
Code:
    void ausgeben() {
        System.out.println(daten);
        if (naechster != null)
            naechster.ausgeben();
    }
Da gehst Du ja rekursiv die Elemente durch. Wenn Du die Methode mal mit eigenen Worten beschreibst: Was macht die Methode? Kannst Du über diese Methode ohne weitere Änderungen an der Liste selbst, die Ausgabe sozusagen "umdrehen"?
 
MoxxiManagarm

MoxxiManagarm

Aktuell kenne ich ja immer nur den Nachfolger. Um die Aufgabenstellung zu lösen, muss ich ja den einzelnen Listenelementen verklickern, wer ihre Vorgänger sind.
Nein, das musst du nicht und sollst du m.E. auch nicht. Man beachte die von mir fett markierte Aussage

"Erweitern Sie die zweite Version der einfach verketteten Liste so, dass die Liste auch rückwärts ausgegeben werden kann. Erstellen Sie dazu eine entsprechende Methode, die sich rekursiv aufruft."
Was du daher brauchst ist eine Dry Function, eine die einen Node erhält und sich rekursiv mit dem Nachfolger dieses Nodes aufruft solange es einen Nachfolger gibt. Nach dem rekursiven Aufruf erfolgt die Ausgabe. Damit erscheint die Ausgabe eines Rekursionsschritts erst nachdem die Rekursion aufgelöst wurde und du erhälst so die Rückwärtsausgabe.
 
J

JustNobody

Die rekursive Methode hat zwei Schritte wenn du diese verstanden hast, dann sollte es ei Fach sein, die Anforderung zu lösen.

Wobei da ja schon Moxxi auch geschrieben hat, was wichtig ist: Nach dem rekursiven Aufruf erfolgt die Ausgabe.
 
MoxxiManagarm

MoxxiManagarm

Es ist wie als ob du erst alle Elemente auf einen Stapel legst und dann abarbeitest. Das sind nur 2 Tätigkeiten - ablegen und bearbeiten.

Pseudo:

printRevert(node)
Wenn node nicht null, dann rekursiver Aufruf mit seinem Nachffolger
Node ausgeben

Dann musst du diese Funktion nur initial mit dem Head der LinkedList aufrufen
 
J

JustNobody

Schau Dir doch einfach einmal Deine Methode ausgeben im Detail an:
Code:
    void ausgeben() {
        System.out.println(daten);
        if (naechster != null)
            naechster.ausgeben();
    }
Da gehst Du ja rekursiv die Elemente durch. Wenn Du die Methode mal mit eigenen Worten beschreibst: Was macht die Methode? Kannst Du über diese Methode ohne weitere Änderungen an der Liste selbst, die Ausgabe sozusagen "umdrehen"?
Wieso nicht einfach ganz einfach einmal diesen ersten Ansatz verfolgen. Was macht diese Methode?

1. Aktuelles Element Ausgeben
2. Restliche Elemente ausgeben

Nun will man die Ausgabe umdrehen, also:
1. Restliche Elemente ausgeben
2. Aktuelles Element ausgeben

Aber nun haben wir mehrfach die Lösung gegeben statt den TE dazu zu bringen, die Lösung zu finden.

Und das finde ich etwas befremdlich, zumal so ein Ansatz komplett ignoriert wurde - und das ist aus meiner Sicht der eigentliche Ansatz bei jeder Entwicklung: man muss sich abstrakt überlegen, wie so etwas gehen könnte bzw. bei bestehendem Code benötigt man erst einmal ein klares Verständnis des Codes...
 
A

Albi_2020

Habe es jetzt hinbekommen mit eurer Hilfe. Vielen Dank. Ja ich muss zugeben, dass mir die rekursiv nicht klar war, Warum die Werte trotzdem gespeichert werden.
 
Thema: 

Doppelt verkettete Liste rückwärts ausgeben

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben