Verkettete Liste - Neu erzeugte Elemente werden nicht ausgegeben

gegner1111

Mitglied
Servus Leute,
ich habe erst vor kurzem mit Java lernen angefangen, also hab ich noch nicht viel Erfahrung...
Zu meinem Problem: Ich will eine eigene verkettete Liste schreiben, die mir 10 Int-Werte einfügt.
Hierfür erzeuge ich mit einer for-Schleife jedes mal ein neues Element (newEle) welches ich dann den Wert 8*i (i=Anzahl des aktuellen Schleifendurchgangs) zuweise.
Doch bei der Ausgabe der fertigen Liste gibt mir das System nur "0"er und als letztes Element die 80 (8*10=80 würde passen) aus.
Woran liegt das? Habe ich den Verweis zwischen den einzelnen Kettenglieder falsch gemacht?
Denn mir kommt es so vor, als würde mein Start-Element gleich auf das letzte/10te Element (Wert 80) verweisen.
Danke schonmal im Voraus!!

Liste.java
Java:
public class List {
    ListElement start;
    int counter = 0;
   
    public List()
    {
        start = new ListElement(0);
    }
   
    public void insertLast(int s)
    {
            int übergabe= s;
            ListElement newEle = new ListElement(übergabe);
            start.next = newEle;
            counter +=1;
           

    }
   
    public void delete(int n)
    {
        if (n<1)
        {
            return;
        }
        ListElement nth = findIndex(n-1);
        if (nth == null)
        {
            return;
        }
       
        ListElement pre = findIndex(n-1);
        pre.next = nth.next;
    }
   
   
    public int get(int n)
    {
       
        if(findIndex(n) == null)
        {
            return 0;
        }
        else
        {
            return findIndex(n).value;
        }
       
    }
   

   
    private ListElement findIndex(int n) //ADRESSE DES ELEMENTS
    {
        if(n < 0)
        {
            return null;
        }
        ListElement iterator = start;
        for ( int i=0; i<n; ++i)
        {   
            if (iterator.hasNext())
            {
                iterator = iterator.next;
            }
            else
            {
                return null;
            }
        }

        return iterator;
    }
}

ListElement.java
Code:
public class ListElement {

    int value;
    ListElement next;
   
    public ListElement(int s)
    {
        value = s;
        next = null;
    }
   
    public boolean hasNext()
    {
        if(this.next == null)
        {
            return false;
        }
        else
        {
            return true;
        }
    }
}

Die Main Datei:
Code:
public class Beispielprogramm
{
    public static void main(String[] args)
    {
        List l= new List();   
       
        for (int i=1; i<=10; ++i)
        {
                l.insertLast(8*i);

        }
       
        l.delete(3);

        for (int i=l.counter; i>=1; --i)
        {
             System.out.print("Liste: " + l.get(i));
        }
   
        System.out.println("Länge: "+l.counter);
       
    }
}
 
Ja. Mit insertLast()setzt du das neue Element als Nachfolger von start. Einen eventuell bereits vorhandenen Nachfolger von start verwirfst du dadurch.

Okay danke Meniskusschaden!
ich hätte dann insertLast() folgendermaßen geschrieben:
Code:
    public void insertLast(int s)
    {
            int übergabe= s;
            ListElement newEle = new ListElement(übergabe);
            if(counter == 0)
            {
                start.next = newEle;
                counter +=1;
            }
           
            else
            {
                newEle.next = newEle;
                counter +=1;
            }
           
    }

denn so wird ja dann jedes neu erzeugte "newEle"-Element mithilfe des Counters auf das nächste Element zugewiesen.
Oder wie würdet ihr das machen? denn meine Ausgabe ist nicht besser...Systemausgabe.png
 
Nein, falls counter nicht gleich 0 ist, setzt du das neue Element jetzt ja als seinen eigenen Nachfolger (erzeugst also einen Zyklus), hängst es aber nicht in die Liste ein. Vorher hast du also nur das letzte Element eingefügt, jetzt fügst du nur das erste ein.
Du solltest das einfach mal auf Papier durchspielen und dann genau so programmieren.
 
Stimmt 😕
habs mir mal aufgemalt, und jetzt kam mir noch ne frage und zwar jedes mal wenn ich
Code:
ListElement newEle = new ListElement(übergabe);
ausführe, erstellt es ja ein neues Element.
Das neu erzeugte Element bekommt ja dann immer den selben Namen "newEle" zugeordnet oder?
kann ich die erzeugten Elemente dann irgendwie explizit ansprechen?
Weil wenn ich zum Beispiel nur "newEle =1;" schreib dann sprech ich ja theoretisch alle erzeugten Elemente an und weise ihnen die "1" zu.
 
ausführe, erstellt es ja ein neues Element.
Ja.
Das neu erzeugte Element bekommt ja dann immer den selben Namen "newEle" zugeordnet oder?
Der Variablen newEle wird dadurch eine Referenz auf das neue Element zugewiesen. Wenn du ihr ein weiteres neues Element zuweisen würdest, würde sie danach nur noch das neue Element referenzieren und nicht mehr das alte. Allerdings kommt es dazu nicht, denn die Variable newEle existiert nur solange, bis die Methode insertLast() beendet wird. Danach wird sie gelöscht. Beim nächsten Methodenaufruf wird wieder eine neue Variable newEle erzeugt.
Weil wenn ich zum Beispiel nur "newEle =1;"
Das geht gar nicht, weil newEle vom Typ ListElement ist und 1 vom Typinteger.
dann sprech ich ja theoretisch alle erzeugten Elemente an
Nein, du kannst immer nur das Element darüber ansprechen, dass zu dem Zeitpunkt über newElereferenziert wird.

Du kannst dir die Liste als einen Zug vorstellen, an dessen Ende du mittels inserLast() einen zusätzlichen Wagon ankoppeln willst.
Bei deinem ersten Versuch hast du den neuen Wagon immer an die Lok angekoppelt und dadurch einen evtl. vorhanden Wagon wieder abgekoppelt.
Bei deinem zweiten Versuch hast du den ersten Wagon an die Lok gekoppelt. Beim zweiten Wagon hast du lediglich mit einem langen Seil seine Vorderseite mit seiner Hinterseite verbunden. Bei allen übrigen ebenso.

Du mußt einfach zum bisher letzten Wagon des Zuges gehen und dort den neuen Wagon anhängen. Das dafür nötige Prinzip hast du in findNext() bereits genutzt (wobei ich eine while-Schleife passender finde).
 

Zurück
Oben