linkedlist generische klassen

H

Heyoka955

Gast
Also schau doch nur, was du da machst... current.next wird das einzufügende Element und dann im nächsten Befehl setzt du current.next wieder und überschreibst damit den Verweis auf das neue Element.

Und der Zugriff auf current.next.value scheint auch dubios zu sein. next kann ja null sein und dann sollte da eine NPE kommen.....
ich habe das jetzt returnt aber es kommt immernoch nix raus außer die 5
 
K

kneitzel

Gast
Ich will mal die 100 vollmachen und sagen, dass dieser Thread mal wieder ein Beweis für die unendliche Geduld von einigen Mitgliedern hier ist.

Ist ja echt unglaublich, wie man da teilweise noch ruhig bleiben kann, bei mir schwankt es zwischenzeitlich echt zwischen Wut, Verzweifelung, Belustigung und tiefer Trauer :D
Ach was ... Gibt doch schlimmeres ... Könnte ja Geschichten erzählen, die ich z.B. bei der Feuerwehr erlebt habe .... Da zweifelt man am GMV (Gesunder Menschen Verstand).

Da ist das doch noch relativ harmlos....

Und soll ich euch eine Schlaflose Nacht bescheren? Ich habe gehört, dass er morgen bei euch im Team als Software Entwickler anfangen soll ....

Das ist doch besser als jeder Horror Film :p
 
K

kneitzel

Gast
ich habe das jetzt returnt aber es kommt immernoch nix raus außer die 5
Ich weiss nicht, was du wo zurück gegeben hast, aber evtl. ist es an der Zeit das Debuggen zu üben. Oder einfach noch einmal mit Papier und Stift genau überlegen, welche Fälle es alle gibt und was du da erwartest. (Einfügen in leere Liste, mit Wert an den Anfang, ans Ende und zwischen zwei Werte...)
 
H

Heyoka955

Gast
Hab alles durch den Kopf gehen lassen.

Laut meiner Auffassung musste der Fehler bei

Newnode.next= current.next;

Es müsste heißen newnode = current.next;

Hab es leider nicht ausgetestet denn habe Laptop nicht mit aber würde mich aufn Statement freuen.
 
K

kneitzel

Gast
Hab alles durch den Kopf gehen lassen.

Laut meiner Auffassung musste der Fehler bei

Newnode.next= current.next;

Es müsste heißen newnode = current.next;

Hab es leider nicht ausgetestet denn habe Laptop nicht mit aber würde mich aufn Statement freuen.
Also Du brauchst erst einmal keinen Laptop. Alles was Du brauchst ist ein Stift und ein leeres Blatt Papier.

Und dann überlegst Du Dir alle Fälle, die es geben könnte (und die ich Dir sogar schon genannt habe!).

Und dann malst Du Dir das richtig auf, d.h. ein ListNode ist dann ein Kästchen mit mehreren Feldern für alles, was da so drin ist (value und next habe ich jetzt im Kopf).

Und bei Referencen machst Du einfach einen Pfeil.

Erster Fall: Liste leer. Also Head enthält null. Wenn das der Fall ist, dann muss head auf das neue Element zeigen und das das next vom neuen Element behält null. => Super, das scheinst Du in Deinem Code schon zu haben.

Zweiter Fall: Liste nicht leer, Eingefügt werden soll am Anfang der Liste. Mal es Dir auf und dann sag, was wie gesetzt werden muss!

Dritter Fall: Liste nicht leer, Eingefügt werden soll zwischen zwei Elementen. Auch hier wieder aufmalen und dann kannst Du sagen, was gesetzt werden muss. (Das scheinst Du in Deinem Code auch schon zu haben. Hattest Du zu dem Code davor schon angepasst. Aber die Schleife stimmt so noch nicht und das Problem habe ich auch schon genannt meine ich!)

Vierter Fall: Liste nicht leer, Eingefügt werden soll am Ende. Aufmalen und dann kannst Du sagen, was da wie gesetzt werden muss.

Also selbst ich male mir sowas immer auf. Visualisieren ist extrem wichtig! Ansonsten geht schnell etwas schief. Ok, einfach verkettete Liste ist trivial, aber es geht auch komplexer z.B. binärer, ausbalancierter Suchbaum ist schon etwas komplexer mit den Drehungen rechts oder links nach dem Einfügen .... Da hilft (bei mir) nur das Durchspielen auf einem Zettel.
 
H

Heyoka955

Gast
Also Du brauchst erst einmal keinen Laptop. Alles was Du brauchst ist ein Stift und ein leeres Blatt Papier.

Und dann überlegst Du Dir alle Fälle, die es geben könnte (und die ich Dir sogar schon genannt habe!).

Und dann malst Du Dir das richtig auf, d.h. ein ListNode ist dann ein Kästchen mit mehreren Feldern für alles, was da so drin ist (value und next habe ich jetzt im Kopf).

Und bei Referencen machst Du einfach einen Pfeil.

Erster Fall: Liste leer. Also Head enthält null. Wenn das der Fall ist, dann muss head auf das neue Element zeigen und das das next vom neuen Element behält null. => Super, das scheinst Du in Deinem Code schon zu haben.

Zweiter Fall: Liste nicht leer, Eingefügt werden soll am Anfang der Liste. Mal es Dir auf und dann sag, was wie gesetzt werden muss!

Dritter Fall: Liste nicht leer, Eingefügt werden soll zwischen zwei Elementen. Auch hier wieder aufmalen und dann kannst Du sagen, was gesetzt werden muss. (Das scheinst Du in Deinem Code auch schon zu haben. Hattest Du zu dem Code davor schon angepasst. Aber die Schleife stimmt so noch nicht und das Problem habe ich auch schon genannt meine ich!)

Vierter Fall: Liste nicht leer, Eingefügt werden soll am Ende. Aufmalen und dann kannst Du sagen, was da wie gesetzt werden muss.

Also selbst ich male mir sowas immer auf. Visualisieren ist extrem wichtig! Ansonsten geht schnell etwas schief. Ok, einfach verkettete Liste ist trivial, aber es geht auch komplexer z.B. binärer, ausbalancierter Suchbaum ist schon etwas komplexer mit den Drehungen rechts oder links nach dem Einfügen .... Da hilft (bei mir) nur das Durchspielen auf einem Zettel.
Ich hatte mit Stift und Papier nur die Falle abgedeckt am Anfang wenn Head = null ist und einfügen in der Mitte.
Ich gehe das durch später.
 
H

Heyoka955

Gast
Also Du brauchst erst einmal keinen Laptop. Alles was Du brauchst ist ein Stift und ein leeres Blatt Papier.

Und dann überlegst Du Dir alle Fälle, die es geben könnte (und die ich Dir sogar schon genannt habe!).

Und dann malst Du Dir das richtig auf, d.h. ein ListNode ist dann ein Kästchen mit mehreren Feldern für alles, was da so drin ist (value und next habe ich jetzt im Kopf).

Und bei Referencen machst Du einfach einen Pfeil.

Erster Fall: Liste leer. Also Head enthält null. Wenn das der Fall ist, dann muss head auf das neue Element zeigen und das das next vom neuen Element behält null. => Super, das scheinst Du in Deinem Code schon zu haben.

Zweiter Fall: Liste nicht leer, Eingefügt werden soll am Anfang der Liste. Mal es Dir auf und dann sag, was wie gesetzt werden muss!

Dritter Fall: Liste nicht leer, Eingefügt werden soll zwischen zwei Elementen. Auch hier wieder aufmalen und dann kannst Du sagen, was gesetzt werden muss. (Das scheinst Du in Deinem Code auch schon zu haben. Hattest Du zu dem Code davor schon angepasst. Aber die Schleife stimmt so noch nicht und das Problem habe ich auch schon genannt meine ich!)

Vierter Fall: Liste nicht leer, Eingefügt werden soll am Ende. Aufmalen und dann kannst Du sagen, was da wie gesetzt werden muss.

Also selbst ich male mir sowas immer auf. Visualisieren ist extrem wichtig! Ansonsten geht schnell etwas schief. Ok, einfach verkettete Liste ist trivial, aber es geht auch komplexer z.B. binärer, ausbalancierter Suchbaum ist schon etwas komplexer mit den Drehungen rechts oder links nach dem Einfügen .... Da hilft (bei mir) nur das Durchspielen auf einem Zettel.
er vertauscht die werte die er einfügt aber irgendwie gibt er die 5 nicht aus?



Java:
public class ListNode<T extends Comparable<T>> {
    ListNode<T> head = null;
    T value;
    ListNode<T> next;
    
    
    public ListNode(T value){
        
        this.value=value;
        
        
    }
    
    
    
    public void insert( T newvalue){
        ListNode<T> node = new ListNode<T>(newvalue);
        
        //einfügen anfang
        if(head == null){
                head = node;
                return;
            
            
            
        }
            
        //einfügen zwei elemeente
        
        if(head.next == null){
            if(head.value.compareTo(node.value) == -1){
                head.next = node;                    // wenn mein neues element größer als head ist
                return;
                
                
            }                                                                 
            else {
                

            node.next = head;    //wenn mein neues element kleiner head ist.
            
            head = node;
                return;
            }
        
        
        }
        
        
        
        
    
        
        
        

        
        
        
        
    }
    
    public void printList(){
        ListNode<T> current = head;
        
        while(current != null){
            System.out.print(current.value + "  --> ");
            
            current = current.next;
            
            
        }
        
        
    }
        
        

    
    
    public int size() {
        
        ListNode<T> current = head;
        int count = 0;
        
        while(current != null){
            
            count++;
            current = current.next;
            
            
        }
        
        return count;
        
        
        
        

    }   
        
    
    
    
}




import java.util.Collections;

public class Test {
    
    public static void main (String[] args) {
        ListNode<Integer> head = new ListNode<Integer>(5);
        head.insert(9);
        head.insert(1);
        head.insert(3);
        head.insert(2);
        
        
        head.printList();
        
        
    }
}



11731
 
K

kneitzel

Gast
Dann geh doch einmal deinen Code und spiel es händisch durch....
Head=null und du fügst ein Element ein:
Head -> 9
Nun kommt mit die 1, Head ist nicht null, aber Head.next ist null, also vergleicht er und fügt die 1 entsprechend ein ....
Head -> 1 -> 9
Nun kommt die nächste Zahl, was macht Dein Code?
 
H

Heyoka955

Gast
Dann geh doch einmal deinen Code und spiel es händisch durch....
Head=null und du fügst ein Element ein:
Head -> 9
Nun kommt mit die 1, Head ist nicht null, aber Head.next ist null, also vergleicht er und fügt die 1 entsprechend ein ....
Head -> 1 -> 9
Nun kommt die nächste Zahl, was macht Dein Code?
nichts weil es keine Abfragung dazu gibt aber das problem ist die 5 die ich am anfang einfüge
beim herstelllen des nodes gebe ich eine 5 als paramter aber die funz net wirklich,
er spuckt die nicht aus.
 
Zuletzt bearbeitet von einem Moderator:
K

kneitzel

Gast
Du fügst keine 5 ein. Dein Listenkopf sollte eigentlich nur eine Referenz auf ein ersten Node haben und keinen Wert. Bei Dir steckt aber auch ein Wert mit drin.

Wenn das der erste Wert sein soll, dann musst du den Wert natürlich mit ausgeben und einigen Code ändern. Aber dann hast Du auch keine leere Liste mehr....

Also normalerweise ist eine Liste eine Klasse und ListNode eine andere Klasse, meist eine inner class. So kenne ich die Implementationen zumindest.
 
H

Heyoka955

Gast
Du fügst keine 5 ein. Dein Listenkopf sollte eigentlich nur eine Referenz auf ein ersten Node haben und keinen Wert. Bei Dir steckt aber auch ein Wert mit drin.

Wenn das der erste Wert sein soll, dann musst du den Wert natürlich mit ausgeben und einigen Code ändern. Aber dann hast Du auch keine leere Liste mehr....

Also normalerweise ist eine Liste eine Klasse und ListNode eine andere Klasse, meist eine inner class. So kenne ich die Implementationen zumindest.
ich eig auch aber mein prof hat im video alles auf einmal gemacht und daher dachte ich evtl auch komm der willl das vllt so machen.

ja dann mache ich die Abfragung wenn mehrere Elemente vorhanden sind.
 

AndiE

Top Contributor
Ich finde den Code so überhaupt nicht wartbar. Ich würde so vorgehen:

1. Liste anlegen
2. Objekt erzeugen
3. Objekt an Liste einfügen
( 2. und 3. solange wiederholen, bis alle Elemente eingefügt sind)
4. Liste ausgeben
5. Liste sortieren
6. Liste ausgeben

Dabei soll sich die Liste um ihre Dinge kümmern und das Objekt um seine.

Und das sauber in zwei ( oder drei) Klassen trennen, damit die Funktion auch nachvollziehbar ist, und Fehler behoben werden können.

So ein Mischmasch mag ja cool sein, aber auch beim "Rover" war das Programm dadurch recht undurchsichtig und schlecht nachvollzieh- und schlecht wartbar.
 
H

Heyoka955

Gast
Ich finde den Code so überhaupt nicht wartbar. Ich würde so vorgehen:

1. Liste anlegen
2. Objekt erzeugen
3. Objekt an Liste einfügen
( 2. und 3. solange wiederholen, bis alle Elemente eingefügt sind)
4. Liste ausgeben
5. Liste sortieren
6. Liste ausgeben

Dabei soll sich die Liste um ihre Dinge kümmern und das Objekt um seine.

Und das sauber in zwei ( oder drei) Klassen trennen, damit die Funktion auch nachvollziehbar ist, und Fehler behoben werden können.

So ein Mischmasch mag ja cool sein, aber auch beim "Rover" war das Programm dadurch recht undurchsichtig und schlecht nachvollzieh- und schlecht wartbar.
mein prof hat das in vl so gemacht er hat einen bintree mit einer klasse gemacht daher wollte ich es auch so machen.

So das funktioniert jedoch sobald ein weiterer node hinzukommt wird
Java:
public class ListNode<T extends Comparable<T>> {
    ListNode<T> head = null;
    T value;
    ListNode<T> next;
    
    
    public ListNode(T value){
        
        this.value=value;
        
        
    }
    
    
    
    public void insert( T newvalue){
        ListNode<T> node = new ListNode<T>(newvalue);
        
        //einfügen anfang
        if(head == null){
                head = node;
                return;
            
            
            
        }
            
        //einfügen zwei elemeente
        
        if(head.next == null){
            if(head.value.compareTo(node.value) == -1){
                head.next = node;                    // wenn mein neues element größer als head ist
                return;
                
                
            }                                                                 
            else {
                

            node.next = head;    //wenn mein neues element kleiner head ist.
            
            head = node;
                return;
            }
        
        
        }
        
        //einfügen bei der mitte
        
        
        
         ListNode<T> current = head;
        
        
         while(current != null){
             if(node.value.compareTo(current.value) == 1 && node.value.compareTo(current.next.value) == -1){
                 node.next = current.next;
                 current.next = node;
                 return;
                
                
             }
            
            
            
         }
        

        
        
        
        
    }
    
    public void printList(){
        ListNode<T> current = head;
        
        while(current != null){
            System.out.print(current.value + "  --> ");
            
            current = current.next;
            
            
        }
        
        
    }
        
        

    
    
    public int size() {
        
        ListNode<T> current = head;
        int count = 0;
        
        while(current != null){
            
            count++;
            current = current.next;
            
            
        }
        
        return count;
        
        
        
        

    }   
        
    
    
    
}
11732
 

mrBrown

Super-Moderator
Mitarbeiter
Ich finde den Code so überhaupt nicht wartbar. Ich würde so vorgehen:

1. Liste anlegen
2. Objekt erzeugen
3. Objekt an Liste einfügen
( 2. und 3. solange wiederholen, bis alle Elemente eingefügt sind)
4. Liste ausgeben
5. Liste sortieren
6. Liste ausgeben
Genau so wie du es beschreibst ist es doch umgesetzt? Bis auf Schritt 5 & 6, da die Liste immer sortiert sein soll.
 
Zuletzt bearbeitet:

mrBrown

Super-Moderator
Mitarbeiter
Brauche Hilfe bei den Bug


Aktuell kommt der Fehler daher, dass dein head nicht nur Kopf der Liste, sondern auch Teil der Liste ist. Wenn du innerhalb ListNode head benutzt, überspringst du das erste Listen-Element ("this"). Eben das musst du verhindern, wie das geht, solltest du schon selbst rausfinden ;) Leere Listen sind dabei aber nicht möglich.



Sinnvoller wären aber zwei Varianten:
Entweder zusätzlich zu ListNode eine List-Klasse einführen, und head aus ListNode in diese verschieben.
Oder head aus ListNode entfernen, der Knoten mit value==null ist dann der implizite Head.
 
H

Heyoka955

Gast
Aktuell kommt der Fehler daher, dass dein head nicht nur Kopf der Liste, sondern auch Teil der Liste ist. Wenn du innerhalb ListNode head benutzt, überspringst du das erste Listen-Element ("this"). Eben das musst du verhindern, wie das geht, solltest du schon selbst rausfinden ;) Leere Listen sind dabei aber nicht möglich.



Sinnvoller wären aber zwei Varianten:
Entweder zusätzlich zu ListNode eine List-Klasse einführen, und head aus ListNode in diese verschieben.
Oder head aus ListNode entfernen, der Knoten mit value==null ist dann der implizite Head.
Aktuell kommt der Fehler daher, dass dein head nicht nur Kopf der Liste, sondern auch Teil der Liste ist. Wenn du innerhalb ListNode head benutzt, überspringst du das erste Listen-Element ("this"). Eben das musst du verhindern, wie das geht, solltest du schon selbst rausfinden ;) Leere Listen sind dabei aber nicht möglich.



Sinnvoller wären aber zwei Varianten:
Entweder zusätzlich zu ListNode eine List-Klasse einführen, und head aus ListNode in diese verschieben.
Oder head aus ListNode entfernen, der Knoten mit value==null ist dann der implizite Head.
Sorry ich wusste was du meintest erst jetzt, das current blieb gaze zeit stehen bei head,

hatte das wohl ausversehen gelöscht, aber wieso printet der die 5 nicht aus?
 
Zuletzt bearbeitet von einem Moderator:
K

kneitzel

Gast
Bitte male Dir doch einmal genau auf einen Zettel, wie die Instanzen, die Du erzeugt hast, aussehen. Zu jeder Instanz gehört head, value und next.

Und dann spielst Du Deinen Code einmal durch. Dann solltest Du es genau sehen.

Und bezüglich Deines Designs haben wir mehrfach etwas gesagt. Das macht so absolut keinen Sinn. Zum einen gibt es eine Trennung zwischen einer Liste und einem ListenNode. Beides in eine Klasse zu packen ist Unsinn, denn so hat jeder Node den head, den der Node aber gar nicht braucht. Und die Liste hat Value und Next, was auch keinen Sinn macht.

Und wenn man sowas wirklich machen wollte (Wofür ich keinen Sinn sehe), dann sollten die Schnittstellen passen. Eine Liste erzeugt man leer. Also ein Konstruktor, der ein ersten Wert bekommt, macht wenig Sinn (Zumindest so lange das der Einzige ist).
Und dann müsste man genau unterscheiden, welche Funktionen wie erreichbar sein müssen. Viele Funktionen wären dann schlicht private. Der Konstruktor mit dem Wert macht nur Sinn innerhalb der Liste, also private. Und alles, was die Liste nur intern braucht, wäre dann auch private.

Aber das macht man dann normalerweise mit zwei Klassen und da der ListNode ein Implementierungsdetail der List ist, wird dieser auch gerne als inner class definiert. Außer der List muss da auch nie jemand zugreifen.
 
H

Heyoka955

Gast
Bitte male Dir doch einmal genau auf einen Zettel, wie die Instanzen, die Du erzeugt hast, aussehen. Zu jeder Instanz gehört head, value und next.

Und dann spielst Du Deinen Code einmal durch. Dann solltest Du es genau sehen.

Und bezüglich Deines Designs haben wir mehrfach etwas gesagt. Das macht so absolut keinen Sinn. Zum einen gibt es eine Trennung zwischen einer Liste und einem ListenNode. Beides in eine Klasse zu packen ist Unsinn, denn so hat jeder Node den head, den der Node aber gar nicht braucht. Und die Liste hat Value und Next, was auch keinen Sinn macht.

Und wenn man sowas wirklich machen wollte (Wofür ich keinen Sinn sehe), dann sollten die Schnittstellen passen. Eine Liste erzeugt man leer. Also ein Konstruktor, der ein ersten Wert bekommt, macht wenig Sinn (Zumindest so lange das der Einzige ist).
Und dann müsste man genau unterscheiden, welche Funktionen wie erreichbar sein müssen. Viele Funktionen wären dann schlicht private. Der Konstruktor mit dem Wert macht nur Sinn innerhalb der Liste, also private. Und alles, was die Liste nur intern braucht, wäre dann auch private.

Aber das macht man dann normalerweise mit zwei Klassen und da der ListNode ein Implementierungsdetail der List ist, wird dieser auch gerne als inner class definiert. Außer der List muss da auch nie jemand zugreifen.
jo ich habe es gemacht und kam zu dem entschluss dass es eig sinn macht wenn ich im Konstruktor die insert Methode aufrufe aber leider erscheint ein bug.
 
H

Heyoka955

Gast
Verwendest Du ihn irgendwo? Wenn nein: Weg damit. Wenn ja: von wo? Dann kannst Du es so modifizieren, dass es evtl. niemand anderes mehr aufruft....
ne brauche ich nicht merh zu verwenden.

es gibt noch einen fall zu beachten und zwar falls ein wert eingefügt wird der kleiner als der erste node ist,
sagen wir wir haben die liste mir werten drinne wie 1-2-3-4

und wenn man 0 oder -5 einfügt dann sortiert er das nicht, aber ich pausiere mal.

denke das reicht
 
H

Heyoka955

Gast
Und wie sieht dein Code jetzt aus?
Java:
public class ListNode<T extends Comparable<T>> {
    ListNode<T> head = null;
    T value;
    ListNode<T> next;
    
    
    
    public ListNode(T value){
        
        this.value=value;
        
        
    }
    
    
    public ListNode(){
        
        
        
        
    }
    
    public void insertEmptyList(ListNode<T> node){
        //einfügen wenn liste leer
        if(head == null){
                head = node;
                
            return;
            
            
        }
    }
        
    public void insertIfNodeexists(ListNode<T> node){
        
        if(head.value.compareTo(node.value) == -1){
                head.next = node;                    // wenn mein neues element größer als head ist
                return;
                
                
            }                                                                 
            
                

            node.next = head;    //wenn mein neues element kleiner head ist.
            
            head = node;
                return;
            
        
        
        
        
        
        
        
    }
    
    
    public void insert( T newvalue){
        ListNode<T> node = new ListNode<T>(newvalue);
        
        if(head == null){
            insertEmptyList(node);
            return;
        }
        
        //einfügen zwei elemeente
        
        if(head.next == null){
            insertIfNodeexists(node);
            return;
        }
        //einfügen bei der mitte oder am ende
        
        insertInTheMiddleOrLast(node);   
    }
    
    
    
    
    
    public void insertInTheMiddleOrLast(ListNode<T> node){
        ListNode<T> current = head;
         while(current != null){
            
            if(node.value.compareTo(current.value) == 1 && current.next == null){
                     current.next = node;
                    node.next = null;
                    return;
                    
            }
            
            else if(node.value.compareTo(current.value) == 1 && node.value.compareTo(current.next.value) == -1){
                    
                 node.next = current.next;
                 current.next = node;
                 return;
                
                
            }
              

        current = current.next;
        }
        
        
        
    }
    
    public void printList(){
        
        ListNode<T> current = head;
        
        while(current != null){
            System.out.print(current.value + "  --> ");
            
            current = current.next;
            
            
        }
        
        
    }
        
        

    
    
    public int size() {
        
        ListNode<T> current = head;
        int count = 0;
        
        while(current != null){
            
            count++;
            current = current.next;
            
            
        }
        
        return count;
        
        
        
        

    }   
        
    
    
    
}
 
K

kneitzel

Gast
Also ich finde den Code relativ unübersichtlich.

Wenn ich etwas in die Liste einfügen muss, dann mache ich es komplett anders! Ich würde das Umgangssprachlich wie folgt umschreiben:
a) Ich prüfe, ob ich das Element am Anfang einfügen muss. Wenn dies der Fall ist, dann füge ich das neue Element an den Anfang und bin fertig.
b) Dann gehe ich so lange durch die Liste, bis ich bei dem Element bin, hinter das ich das neue Element einfügen muss und füge das Element dann entsprechend ein.

Die genauen Kriterien sowie das genaue Vorgehen sind noch zu benennen. Aber der Code wird dann relativ einfach und übersichtlich.

Zur Hilfe: Bei a und b sind jeweils zwei Dinge zu prüfen!
 

mrBrown

Super-Moderator
Mitarbeiter
Java:
ListNode<T> head = null;
T value;
ListNode<T> next;
   
public ListNode(T value){
//...
}
     
public ListNode(){
//...
}

public void insertEmptyList(ListNode<T> node){
//...
}
public void insertIfNodeexists(ListNode<T> node){
//...
}
public void insert( T newvalue){
//...
}
public void insertInTheMiddleOrLast(T newValue) {
//...
}
Um das mal zusammenzufassen: du hast alle Vorschläge und Hinweise ignoriert und alles nur noch schlimmer gemacht.
 
H

Heyoka955

Gast
Also ich finde den Code relativ unübersichtlich.

Wenn ich etwas in die Liste einfügen muss, dann mache ich es komplett anders! Ich würde das Umgangssprachlich wie folgt umschreiben:
a) Ich prüfe, ob ich das Element am Anfang einfügen muss. Wenn dies der Fall ist, dann füge ich das neue Element an den Anfang und bin fertig.
b) Dann gehe ich so lange durch die Liste, bis ich bei dem Element bin, hinter das ich das neue Element einfügen muss und füge das Element dann entsprechend ein.

Die genauen Kriterien sowie das genaue Vorgehen sind noch zu benennen. Aber der Code wird dann relativ einfach und übersichtlich.

Zur Hilfe: Bei a und b sind jeweils zwei Dinge zu prüfen!
ich hätte dann zwei Methoden zu einer machen können evtl aber ich sollte für jeden Aufgabenbereich in Methoden aufteilen.
 
H

Heyoka955

Gast
Um das mal zusammenzufassen: du hast alle Vorschläge und Hinweise ignoriert und alles nur noch schlimmer gemacht.
hä wieso? ich habe doch alles befolgt ?
achso ja stimmt ich sollte ja das aufteilen in node und list, ja aber ich hass es wenn ich etwas nicht zu ende bringen kann.
hätte ich das jetzt beendet würde ich mich schlecht fühlen,

Ich kann es natürlich umändern
 

mrBrown

Super-Moderator
Mitarbeiter
a) Ich prüfe, ob ich das Element am Anfang einfügen muss. Wenn dies der Fall ist, dann füge ich das neue Element an den Anfang und bin fertig.
b) Dann gehe ich so lange durch die Liste, bis ich bei dem Element bin, hinter das ich das neue Element einfügen muss und füge das Element dann entsprechend ein.
Kann man auch etwas einfacher lösen (abhängig davon, wie man mit dem Listenkopf umgeht):

Solange über die Knoten iterieren, bis der nächste Wert kleiner als der aktuelle ist, dann vor diesem einfügen.

Sind knapp 10 Zeilen, anstatt 4 Methoden über zig Zeilen wie bei ihm...
 

mrBrown

Super-Moderator
Mitarbeiter
hä wieso? ich habe doch alles befolgt ?
Mach den einen Konstruktiv privat.

Schmeiß das head-Feld weg, das ist Unsinn (wenn, gehört das in eine Wrapper-Klasse für die Liste.

Beim Einfügen musst du keinerlei Sonderfälle berücksichtigen. Vor allem braucht man dazu keine vier öffentlichen Methoden, sondern nur eine: insert.
 
H

Heyoka955

Gast
Kann man auch etwas einfacher lösen (abhängig davon, wie man mit dem Listenkopf umgeht):

Solange über die Knoten iterieren, bis der nächste Wert kleiner als der aktuelle ist, dann vor diesem einfügen.

Sind knapp 10 Zeilen, anstatt 4 Methoden über zig Zeilen wie bei ihm...
ich hatte ja eine Stellung dazu gemacht aber, ich kann auch alles in einer Methode packen aber ich sollte das aufteilen.
 
K

kneitzel

Gast
Kann man auch etwas einfacher lösen (abhängig davon, wie man mit dem Listenkopf umgeht):

Solange über die Knoten iterieren, bis der nächste Wert kleiner als der aktuelle ist, dann vor diesem einfügen.

Sind knapp 10 Zeilen, anstatt 4 Methoden über zig Zeilen wie bei ihm...
Nunja, beim Vorher einfügen ist der Fall mit dem einfügen vor dem ersten Element wichtig. Da muss man so wie so prüfen. Daher lag es für mich auf der Hand, dass ich dann nur noch das danach einfügen prüfen würde mit einer Schleife.

Aber klar, so wie von Dir beschrieben geht es natürlich auch :)
 

mrBrown

Super-Moderator
Mitarbeiter
ich hatte ja eine Stellung dazu gemacht aber, ich kann auch alles in einer Methode packen aber ich sollte das aufteilen.
Wenn du die Liste sinnvoll umsetzte (hier gab es mehr als genug Tipps...), hast du in der Methode keinerlei zu berücksichtigende Sonderfälle, für die du jetzt die drei Methoden brauchst.
Du kannst das dann aber natürlich auch in sinnvolle Methoden aufteilen, aber eben sinnvoll geteilt nach dem, was sie machen (zB Position suchen und an dieser Position einfügen), und nicht nach "die Liste ist leer", "die Liste hat ein Element", "die Liste hat mehrere Elemente und am ende oder der Mitte einfügen" (was ja wie du merkst auch noch nicht klappt).
 
K

kneitzel

Gast
Evtl. ist das aus der Auflistung der zu testenden Fälle gekommen. Ich habe ja mehrfach aufgelistet, was für Fälle es aus meiner Sicht gibt:
- Einfügen in leere Liste
- Einfügen an den Anfang der Liste
- Einfügen in die Mitte der Liste
- Einfügen an das Ende der Liste

Aber daraus folgt nicht, dass die alle separat zu implementieren sind, sondern es muss ein Algorithmus gefunden werden, der bei allen Fällen erfolgreich ist.
 
H

Heyoka955

Gast
Evtl. ist das aus der Auflistung der zu testenden Fälle gekommen. Ich habe ja mehrfach aufgelistet, was für Fälle es aus meiner Sicht gibt:
- Einfügen in leere Liste
- Einfügen an den Anfang der Liste
- Einfügen in die Mitte der Liste
- Einfügen an das Ende der Liste

Aber daraus folgt nicht, dass die alle separat zu implementieren sind, sondern es muss ein Algorithmus gefunden werden, der bei allen Fällen erfolgreich ist.

Mein Code funktioniert bei allen drei natürlich wäre es besser wenn der akgothmus in einer Methode wäre.
Aber das Problem ist dass wenn man zahlen einfügt die kleiner als der aktuelle Head ist dann fügt er die nicht ein.

Ich hätte eine Anfrage schreiben sollen die das überprüft.
 
K

kneitzel

Gast
Ja, da fehlt dann eine Abfrage, wenn der Fall nicht berücksichtigt wird. Den Pseudocode, der einfach und gut lesbar ist, habe ich ja schon geliefert.
 
K

kneitzel

Gast
Scheint so dass ich doch nicht so schlecht bin
Deine Selbsteinschätzung dürfte nicht mit denen der Meisten hier übereinstimmen.

Wir haben dir sehr viel Informationen gegeben, von denen du nur sehr wenig umgesetzt hast.

Der Pseudocode zusammen mit den weiteren Hinweisen hätte Dich schon lange zu einer Lösung wie:
führen müssen.

Und den Zeitbedarf für eine Lösung, die nicht einmal richtig funktioniert muss man nicht wirklich kommentieren, oder? (Nein, es geht nicht darum, ob jemand 30 Minuten oder 2 Stunden braucht. Hier ist ja ganz offensichtlich mehr Zeit investiert worden, als unbedingt notwendig gewesen wäre und das, ohne dass zumindest ich einen Lerneffekt erkennen könnte...
 
K

kneitzel

Gast
@kneitzel Ich weiß gar nicht, was Du hast. Noch nicht mal 150 Kommentare und schon funktioniert so etwas kompliziertes wie eine verkettete Liste... fast...
Ja, aber der arme Dozent, der sich seinen Code ansehen muss.... Der fällt bestimmt 2 Wochen wegen schwerer Gehirnerschütterung aus. Oder kannst Du Dir vorstellen, dass der sowas ansehen kann ohne seinen Kopf dann schnell Richtung Tischplatte zu bewegen?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B generische LinkedList nach Häufigkeit der Elemente füllen Java Basics - Anfänger-Themen 6
A LinkedList implementieren Java Basics - Anfänger-Themen 32
M Wie kann ich den Index i von einer LinkedList überprüfen? Java Basics - Anfänger-Themen 36
Düsseldorf2002 Datentypen Verschachtelte LinkedList Java Basics - Anfänger-Themen 5
Düsseldorf2002 Datentypen Zwei dimensionale LinkedList Java Basics - Anfänger-Themen 8
B Warteschlange erstellen mit LinkedList ? Java Basics - Anfänger-Themen 6
U Objekte in LinkedList löschen und editieren Java Basics - Anfänger-Themen 14
G Java LinkedList remove Methode Java Basics - Anfänger-Themen 5
G Java LinkedList Java Basics - Anfänger-Themen 6
U Objekte in einer LinkedList sortieren Java Basics - Anfänger-Themen 5
S Eigene LinkedList Klasse Java Basics - Anfänger-Themen 4
S Mit einer LinkedList vorwärts und rückwärts iterieren Java Basics - Anfänger-Themen 6
S Endlosschleife beim Ausgeben einer LinkedList Java Basics - Anfänger-Themen 2
G Java LinkedList Java Basics - Anfänger-Themen 3
B LinkedList add-Methode Java Basics - Anfänger-Themen 10
F Windows in LinkedList registrieren Java Basics - Anfänger-Themen 3
A Hilfe, LinkedList Java Basics - Anfänger-Themen 2
H Knoten-Reihenfolge einer LinkedList invertieren Java Basics - Anfänger-Themen 11
O Hashmap, ArrayList, LinkedList Java Basics - Anfänger-Themen 7
P Quellcode LinkedList Java Basics - Anfänger-Themen 2
F Collection Aufgabe mit LinkedList Java Basics - Anfänger-Themen 3
N Hilfe bei verknüpfter Liste - Linkedlist Java Basics - Anfänger-Themen 11
P Datentypen LinkedList: Kopie behält Referenz? Java Basics - Anfänger-Themen 3
C ArrayList vs LinkedList vs ? Java Basics - Anfänger-Themen 15
C LinkedList vs. ArrayList Java Basics - Anfänger-Themen 15
O LinkedList zu ArrayList Java Basics - Anfänger-Themen 4
M LinkedList elemente löschen Java Basics - Anfänger-Themen 2
L Problem mit LinkedList Java Basics - Anfänger-Themen 3
F In LinkedList einen Wert ersetzen oder neu einfügen Java Basics - Anfänger-Themen 7
P Hashmap anstatt LinkedList? Java Basics - Anfänger-Themen 6
TechGirl LinkedList - kurze allgemeine Frage Java Basics - Anfänger-Themen 17
L LinkedList Comparable < > MEHRFACH implementieren? Java Basics - Anfänger-Themen 3
S LinkedList mit Input vergleichen. Java Basics - Anfänger-Themen 5
C Bei der LinkedList auf Palindrom überprüfen Java Basics - Anfänger-Themen 4
F Element aus LinkedList löschen Java Basics - Anfänger-Themen 3
A LinkedList: Probleme beim Auslesen Java Basics - Anfänger-Themen 2
T Collections LinkedList<LinkedList<T>> - Implementierung Java Basics - Anfänger-Themen 10
S Jfreechart mit LinkedList befüllen Java Basics - Anfänger-Themen 1
S JTable LinkedList <Objekt> befüllen Java Basics - Anfänger-Themen 1
K LinkedList aus Arrays ( Lösungsraum Mastermind ) Java Basics - Anfänger-Themen 5
Z Compiler-Fehler LinkedList Fragen Java Basics - Anfänger-Themen 4
K Methoden Probleme mit LinkedList.remove(object) Java Basics - Anfänger-Themen 1
Farbenfroh int in LinkedList einsortieren Java Basics - Anfänger-Themen 4
W Klassen LinkedList funktioniert nicht Java Basics - Anfänger-Themen 6
X LinkedList - Index eines Objekts Java Basics - Anfänger-Themen 2
S Strings in eine LinkedList schreiben und auslesen? Java Basics - Anfänger-Themen 4
D Sortieren von int Werten von Objekten in einer LinkedList, kann nicht auf int Werte zugreifen Java Basics - Anfänger-Themen 3
F Eigene LinkedList - toString Java Basics - Anfänger-Themen 10
T Datentypen gleichmäßiges mischen von 2 LinkedList Java Basics - Anfänger-Themen 3
S Dateien/LinkedList/StringBuffer - SOrtierung klappt nicht so ganz Java Basics - Anfänger-Themen 2
J Datentypen Array von einer LinkedList Java Basics - Anfänger-Themen 5
R LinkedList Java Basics - Anfänger-Themen 8
J Per I/O Streams in LinkedList oder ArrayList schreiben/lesen Java Basics - Anfänger-Themen 6
B LinkedList remove Java Basics - Anfänger-Themen 5
J statische Methoden auf eine LinkedList initialisieren? Java Basics - Anfänger-Themen 5
G Hausaufgabe mit LinkedList und LinkedListStack verstehen Java Basics - Anfänger-Themen 6
N LinkedList-checkForComodification Java Basics - Anfänger-Themen 11
N LinkedList Java Basics - Anfänger-Themen 17
P LinkedList sortieren Java Basics - Anfänger-Themen 20
P LinkedList - Stack ... grundlegende Frage Java Basics - Anfänger-Themen 5
Z Erste Schritte LinkedList Werte abfragen und vergleichen Java Basics - Anfänger-Themen 3
B SUCHE: Threadsafe LinkedList Java Basics - Anfänger-Themen 10
Binary.Coder Wie linkedlist für Djikstra nutzen? Java Basics - Anfänger-Themen 6
M Arrays in LinkedList Java Basics - Anfänger-Themen 4
R Collections Probleme mit contains()-Methode [LinkedList] Java Basics - Anfänger-Themen 5
G Collections.binarySearch(LinkedList): cannot find method Java Basics - Anfänger-Themen 6
M LinkedList aktuelle position Java Basics - Anfänger-Themen 3
G Frage zu LinkedList Java Basics - Anfänger-Themen 15
H Dynamische Bindung mit Interfaces und LinkedList Java Basics - Anfänger-Themen 7
I LinkedLIst / ArrayList Konstruktor Java Basics - Anfänger-Themen 4
B Collections RandomAccessfile & Linkedlist Java Basics - Anfänger-Themen 4
S Speichermangel ArrayList/LinkedList Java Basics - Anfänger-Themen 3
V LinkedList size() Java Basics - Anfänger-Themen 2
darekkay Datentypen HashSet bzw. LinkedList mit Werten initialisieren Java Basics - Anfänger-Themen 3
D Probleme mit LinkedList Java Basics - Anfänger-Themen 6
L LinkedList vorgänger Knoten zurück geben Java Basics - Anfänger-Themen 4
S LinkedList indexOf() - geht des irgendwie schneller? Java Basics - Anfänger-Themen 23
S LinkedList<String[]> filtern und sortieren Java Basics - Anfänger-Themen 9
W LinkedList Java Basics - Anfänger-Themen 12
S Frage zum speichern der Daten in einer LinkedList Java Basics - Anfänger-Themen 2
D Fenster in LinkedList verwalten Java Basics - Anfänger-Themen 2
C HashMap mit LinkedList Java Basics - Anfänger-Themen 5
S Datentypen LinkedList Konstruktor, add Alternative Java Basics - Anfänger-Themen 2
truesoul LinkedList Problem Java Basics - Anfänger-Themen 6
M Java Generics LinkedList Java Basics - Anfänger-Themen 5
H LinkedList Element an Stelle x ausgeben? Java Basics - Anfänger-Themen 5
D LinkedList aufrufe Java Basics - Anfänger-Themen 3
S Problem mit ObjectInputStream beim Einlesen von LinkedList Java Basics - Anfänger-Themen 3
S Serialized LinkedList aus Datei Laden Java Basics - Anfänger-Themen 15
S LinkedList Java Basics - Anfänger-Themen 2
M LinkedList in anderer Klasse nutzen Java Basics - Anfänger-Themen 4
L LinkedList sortieren Java Basics - Anfänger-Themen 5
L heap space, LinkedList umspeichern Java Basics - Anfänger-Themen 15
H LinkedList mit Strings Exception Java Basics - Anfänger-Themen 3
S IndexOutofBoundsException bei linkedlist Java Basics - Anfänger-Themen 5
B Fehlersuche bei LinkedList Java Basics - Anfänger-Themen 3
B LinkedList - Berechnung des Produkts Java Basics - Anfänger-Themen 6
S Sortierte LinkedList nach Variablen durchsuchen und nicht nach INDEX Java Basics - Anfänger-Themen 6
B Unterschied ArrayList und LinkedList Java Basics - Anfänger-Themen 5
S Implementierung gegen Interfaces / List, ArrayList, LinkedList Java Basics - Anfänger-Themen 11

Ähnliche Java Themen

Neue Themen


Oben