Einfach verkettet List: Ausgabe ohne null

Jefferio_19

Mitglied
Ich habe ein kleines Problem. Ich habe eine einfach verkette Liste erstellt, die auch funktioniert, will ich diese ausgeben wird mir ganz am Schluss ein null mit ausgegeben. Kann man das irgendwie verhindern?

Die Haupt Liste:
Java:
public class List <T>{
    
    T element;
    List<T> next = null;

    public List(T element) {
        this.element = element;
    }

    public T getElement() {
        return element;
    }

    public void setElement(T element) {
        this.element = element;
    }

    public List<T> getNext() {
        return next;
    }

    public void setNext(List<T> next) {
        this.next = next;
    }

    @Override
    public String toString() {
        return element + "," + next;
    }
  
}

ListElement:
Java:
public class ListElement<T> implements IList{
    List<T> head = null;
    List<T> tail = null;
    int size;

    public ListElement() {
    }

    public void add(T data){
        List<T> obj=new List<>(data);
        
        if (head==null){
            obj.next=null;
            head=obj;
            tail=obj;
        }else{
            tail.next=obj;
            obj.next=null;
            tail=obj;
        }
        size++;
    }

    @Override
    public boolean isEmpty() {
       return size==0;
    }

    @Override
    public T head() {
        return this.head.getElement();
    }

    @Override
    public IList tail() {
        ListElement k1 = new ListElement();

        for (int i=1; i<this.size; i++){
            k1.add(head.next.getElement());
            this.head=head.getNext();
        }
        return k1;
    }

    @Override
    public int size() {
        return size;
    }

    @Override
    public IList filter(ISelect filterPredicate) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
    
    public ListElement<T> next(){
        ListElement l1=new ListElement();
        l1.head=head.getNext();
        l1.size=size;
        return l1;
    }

    @Override
    public String toString() {
        return head + " "+ "size=" +size;
    }

}


Die size wird mir auch richtig ausgegeben. Füge ich beispielsweise die Worte: "Tennis" "Fußball" "Hockey" ein, wird mir folgendes ausgegebenen:

Tennis, Fußball, Hockey, null size=3

Das null möchte ich jedoch nicht ausgeben.
 
Wahrscheinlich liegt es an der Schleife hier:
Java:
 for (int i=1; i<this.size; i++){
k1.add(head.next.getElement());
this.head=head.getNext();
}

Nehmen wir an deine Liste hat 5 Elemente (heißt 0 bis 4), und dein 'head' zeigt schon von Beginn auf das erste Element, wird der Head im letzten Schritt auf null gesetzt.

Zustand am Ende eines Schleifendurchlaufs
i = 0 | head => Element 1
i = 1 | head => Element 2
i = 2 | head => Element 3
i = 3 | head => Element 4
i = 4 | head => Element 5 (null)

Ansonsten ist es auch immer ratsam einfach mit dem Debugger Schritt für Schritt durchzugehen und die Werte zu prüfen.
 
Ich vermute, du gibst zuerst den Wert des nächsten Elementes aus und überprüfst erst dann, ob es null ist.

Es wird gar nicht überprüft, sondern einfach nur rekursiv die Liste ausgegeben.

Wahrscheinlich liegt es an der Schleife hier:
....

Nein, liegt es nicht. Was hat das denn mit der Frage zu tun?


Was Gucky schreibt geht schon in die richtige Richtung, auch wenn er sich offenbar auch keine 5 Sekunden den Code angeschaut hat 😀
In die toString() Methode deiner Liste gehört noch eine gescheite Abbruchbedingung.
 
Nein, liegt es nicht. Was hat das denn mit der Frage zu tun?
Okay, liegt es nicht, sehe ich ein.
Hätte es das aber, dann hätte es auch was mit der Frage zu tun, weil der head auf null gesetzt wäre und somit
auch so ausgegeben würde.
Da es das aber nicht ist, ist das irrelevant.
 
OK danke.
Aber ist denn so eine Abbruchbedingung in der toString Methode "guter Programmierstil" ?
Generell: Habt ihr Verbesserungsvorschläge an der Liste?
 
Die Abbruchbedingung in der toString Methode ist in Ordnung und im Grunde hast du sowieso schon eine drin, nur sieht man sie nciht auf den ersten Blick.
Ich würde hingegen eher eine zusätzliche "printList" Methode schreiben und dir toString Methode gar nicht dafür benutzen den inneren Zustand der Liste auszugeben, aber das ist wohl zum Teil auch Geschmackssache.

Mach dir zunächst mal Gedanken über deine Namensgebung. Ich garantierte dir sonst, dass du jedesmal darüber stolpern wirst, wenn du deine Klassen hier irgendwo anders einsetzen willst.
 
Zuletzt bearbeitet:
@stg
Hast recht. Es waren keine 2, weil ich grade wenig Zeit hatte.

@Jefferio_19
Vielleicht hilft dir ein Konstrukt, wie "if (next == null)" weiter.
 
Er könnte das Listenelement als innere Klasse in List implementieren und es wäre kein schlechter Stil.
Es kommt, wie so oft, auf den Anwendungsfall an.
 
Zuletzt bearbeitet:
Jefferio_19 hat gesagt.:
in eine Klasse verbinden

Das klang so, als ob Verwaltung und Element der Liste dieselbe Klasse sein sollen und das ist schlechter Stil 😉
Zumindest in dem Zusammenhang. Mir ist aber kein Fall bekannt, wo das nützlich sein könnte.
 

Zurück
Oben