Einfach verkettete Liste ändern

Diskutiere Einfach verkettete Liste ändern im Allgemeine Java-Themen Bereich.
OSchriever

OSchriever

Hi Freunde,
ich stehe bei einer Aufgabe zur Erweiterung der einfach verketteten Liste auf dem Schlauch:
Hier folgende Aufgabenstellung:


Erweitern Sie die zweite Version der einfach verketteten Liste so, dass das Listenende
beim Anhängen nicht immer wieder neu ermittelt werden muss, sondern neue Elemente
direkt am Ende der Liste angehängt werden können. Hängen Sie zum Test
mindestens 20 Elemente an.
Dazu ein paar Hilfestellungen:
• Sie müssen neben dem Anfang der Liste jetzt auch das Ende der Liste in einer
Variablen speichern können.
• Erstellen Sie eine Methode, die Ihnen das aktuelle Ende der Liste zurückliefert.
Alternativ können Sie sich das Listenende auch von der Methode zum Anhängen
liefern lassen.
• Setzen Sie den Wert der Variablen für das Listenende nach dem Anhängen neuer
Elemente jeweils auf das aktuelle Ende der Liste und rufen Sie dann die Methode
zum Anhängen neuer Listenelemente mit diesem Wert neu auf.

Und hier der Code:

Java:
//die Klasse für die Listenelemente
//jetzt auch mit Methoden
class Listenelement {
        String daten;
        Listenelement naechster;

        //die Methode zum Setzen der Daten
        void setDaten(String datenNeu) {
            //die Zeichenkette setzen
            daten = datenNeu;
            //das Ende markieren
            naechster = null;
        }

        //die Methode zum Anhängen eines neuen Elements
        //sie ruft sich rekursiv auf, bis das Ende erreicht ist
        void anhaengen(String datenNeu) {
            //wenn das Ende erreicht ist, ein neues Element erzeugen
            if (naechster == null) {
                naechster = new Listenelement();
                naechster.setDaten(datenNeu);
            }
            //sonst ruft sich die Methode selbst wieder auf
            else {
                naechster.anhaengen(datenNeu);
            }
            //nur zur Veranschaulichung
            System.out.println("Daten " + datenNeu + " wurden eingefügt.");
        }

        //die Methode zur Ausgabe der Liste
        //sie ruft sich ebenfalls rekursiv auf, bis das Ende erreicht ist
        void ausgeben() {
            System.out.println(daten);
            if (naechster != null)
                naechster.ausgeben();
        }
    }


Java:
public class Main {

    public static void main(String[] args) {
        Listenelement listenAnfang = new Listenelement();

        //die Daten im ersten Listenelement setzen
        listenAnfang.setDaten("Element 1");

        //weitere Elemente in einer Schleife einfügen
        for (int element = 2; element < 4; element++)
            listenAnfang.anhaengen("Element " + element);

        //die Liste ausgeben
        listenAnfang.ausgeben();
       

    }

}
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
Ich habe schon sämtliche Sachen ausprobiert wie ein 2. Objekt (listenEnde) zu erstellen, in der Main sowie in der Klasse Listenelement und dann auch versucht sie dort zu ändern bzw. das Ende neu zu setzen, aber irgendwie bekomme ich den Dreh nicht rein. Irgendwas mache ich verkehrt, nur was?


Vielen Dank im Voraus
 

Anhänge

mihe7

mihe7

Soll das so sein, dass Du keine Klasse für die Liste sondern nur für das Element hast?

Unabhängig davon: Du brauchst nicht nur eine Variable für den listenAnfang, sondern auch für das listenEnde. Zu Beginn ist listenEnde = listenAnfang. Zum Anhängen verwendest Du dann einfach listenEnde in der Weise: listenEnde = listenEnde.anhaengen("Element " + element);. In dem Fall muss die Methode anhaengen() natürlich das neue Listenende zurückgeben.

Probiers einfach nochmal :)
 
F

flopalko

Ich gebe dir auch noch ein Grundgerüst mit dem du arbeiten kannst:

Java:
public class Liste{
    Listenelement anfang;
    Listenelement ende;
    
    //Methoden zum Verwalten der Liste   

    private class Listenelement{
        String daten;
        Listenelement naechster;
        
        //Methoden für ein Listenelement   
    }
}
 
OSchriever

OSchriever

Soll das so sein, dass Du keine Klasse für die Liste sondern nur für das Element hast?

Unabhängig davon: Du brauchst nicht nur eine Variable für den listenAnfang, sondern auch für das listenEnde. Zu Beginn ist listenEnde = listenAnfang. Zum Anhängen verwendest Du dann einfach listenEnde in der Weise: listenEnde = listenEnde.anhaengen("Element " + element);. In dem Fall muss die Methode anhaengen() natürlich das neue Listenende zurückgeben.

Probiers einfach nochmal :)
Ja das soll so sein, ist halt ne Anfängeraufgabe aus nem Kurs
 
A

Albi_2020

Ich habe das gleiche Problem mit dieser Aufgabe....allerdings habe ich eh noch so meine Schwierigkeiten mit der objektorientierten Programmierung...wie habt ihr das im Code implementiert...? Irgendwie benötige ich mal einen richtigen Schlag vor den Kopp :cool:

LG
Albi
 
Kirby_Sike

Kirby_Sike

Ich habe das gleiche Problem mit dieser Aufgabe....allerdings habe ich eh noch so meine Schwierigkeiten mit der objektorientierten Programmierung...wie habt ihr das im Code implementiert...? Irgendwie benötige ich mal einen richtigen Schlag vor den Kopp :cool:

LG
Albi
Also prinzipiell ist es gar nicht so schwer zu verstehen :) Das Konzept ist, dass du im Grunde einen "Haupt" Kontainer hast, nämlich deine Liste. Diese Liste enthält wiederum Kontainer (ListenElemente), welche dann eine Referenz auf das nächste ListenElement enthalten und noch eine Instanzvariable für ein Objekt, also für den eigentlichen Inhalt, welchen ihr mit dieser Liste verwalten wollt :)
 
A

Albi_2020

Ich fasse mal kurz zusammen:

zunächst wird eine Instanz erzeugt, die den Listenanfang kennzeichnet. Mit der Referenz von listenAnfang wird die Methode setDaten() aufgerufen und der String "Element 1" übergeben. Anschließend besitzt das 1. Element die Werte Daten = Element1 und naechster = null.

Nun werden neue Elemente über die for-Schleife zugefügt und jeweils die Durchlaufnummer als String übergeben. Die Referenz von listenAnfang ruft dabei die Methode anhaengen() auf. Da es bisher nur ein Element gibt, ist naechster == null und die if-Schleife wird durchlaufen.
Ein weiteres Element wird erzeugt und als Referenz in naechster gespeichert --> listenAnfang zeigt nun auf das neue Element. Die neue Referenz ruft die Methode setDaten() auf und speichert daten = Element 2 und naechster = null.
Beim zweiten Durchlauf der Schleife ist ja naechster für listenAnfang nicht mehr null, sondern die Referenz auf das zuvor eingefügte Element. dadurch wird der else-Zweig durchlaufen. Die Referenz des 2. Objekts ruft die Methode rekursiv auf und speichert daten = Element 3 und naechster = null....u.s.w.

Soweit habe ich das auch verstanden. Ich tue mich nun nur schwer, die Referenz vom letzten Element zu speichern (wie bekomme ich die Referenz und nicht das null) und vor allem wo setzte ich diese Information ein.

LG
Albi
 
Kirby_Sike

Kirby_Sike

Naja also die Referenz der Vorgängers muss nur bei DoubleLinkedLists verwaltet werden, da dort in beide Richtungen iterieren kann. Bei einer SingleLinkedList (einfach verkettet) muss nur der Nachfolger gemerkt werden, da nur vom listenAnfang bis zu null iteriert wird :) Welche Liste möchtest du den gerne implementieren?
 
Kirby_Sike

Kirby_Sike

Er behandelt nur eine Single Linked List und somit musst du dir deinen Vorgänger nicht merken :)
 
mihe7

mihe7

Ich tue mich nun nur schwer, die Referenz vom letzten Element zu speichern (wie bekomme ich die Referenz und nicht das null) und vor allem wo setzte ich diese Information ein.
Mal von hinten angefangen: das Listenende kannst Du Dir merken, damit Du schnell ein Element ans Ende hängen kannst und nicht mehr erst durch die ganze Liste iterieren musst. Dazu muss anhaengen() lediglich dahingehend angepasst werden, dass die Methode das neue Listenende zurückgibt. Die Verwendung läuft dann wie unter #2 beschrieben.
 
A

Albi_2020

Habe den Code folgendermaßen geändert:

neuer Code:

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();
}
}


Java:
public class Main {

public static void main(String[] args) {
Listenelement listenAnfang = new Listenelement();

listenAnfang.setDaten("Element 1");

Listenelement listenEnde = listenAnfang;

for (int element = 2; element < 4; element++)
listenEnde = listenEnde.anhaengen("Element " + element);

listenAnfang.ausgeben();


}

}
 
A

Albi_2020

ja funktioniert...super danke....wäre ich alleine nicht drauf gekommen
 
Thema: 

Einfach verkettete Liste ändern

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben