einfach verkettete Liste

RJN

Mitglied
Hallo,
ich habe Schwierigkeiten beim Hinzufügen. Es soll eine verkettete Liste sein, wo ich Tickets mithilfe von Nodes in eine andere Klasse verwalten soll. In der Ticket- und Nodes-Class sind nur Getters und Setters.

Java:
Public class Verwaltung
{
    private Node head;

    public boolean addTicket(Ticket t) {
        if (t == null)
        {
            return false;
        }
        if (head == null)
        {
            head = new Node(t, null);
            return true;
        }

        while (head != null) //Hier tritt der Fehler auf
        {
            //Hier prüfe ich, ob Ticket t schon vorhanden ist.
            if (head.getValue().getKunde().equals(t.getKunde()) && head.getValue().getProblem().equals(t.getProblem()))
            {
                return false;
            }
            if (head.getNext() != null)
            {
                head = head.getNext();
            }
            else
            {
                head = new Node(t, head);
                break;
            }
        }
        
        return true;
}

Mein Problem ist, dass ich die hinteren Tickets nicht überprüfen kann.
 
Du willst ja nur ein Element einfügen. So es nicht das erste Element ist, darfst du head nicht verändern.

Zum Durchlaufen der Liste musst du also eine lokale Variable verwenden, die du auf head setzt und dann so lange in der while Schleife bleibst, bis du am Ende bist.

Das wäre, was mir so auf Anhieb auffällt. Den Fehler den du bekommst hast du aber auch nicht wirklich gut beschrieben, daher ist unklar ob dies auch wirklich Dein Problem ist.
 
Danke für die Rückmeldung.

Sie haben gesagt, dass head unverändert bleiben soll. Sollte ich mithilfe der Laufvariable eine neue Node erstellen?
 
Es ist exakt so, wie kneitzel sagt: Wenn du deine Suche immer am Anfang der Liste beginnen möchtest (und das solltest du), muss head die Referenz auf den Anfang der Liste halten. Zum Durchlaufen der Liste benutzt du einen Iterator, der in diesem Fall den Typ Node haben muss.

Zweifel bestehen von meiner Seite an der Bedingung in der while-Schleife, denn die Schleife wird nur solange ausgeführt, bis head null ist. Da dies aber genau der Moment ist, indem das neue Ticket in die Liste eingefügt werden soll, darf der Code für das Einfügen nicht in der while-Schleife stehen, oder? Deshalb habe ich deinen restlichen Code geraten und ein bisschen experimentiert.

Mir ist klar, dass in diesem Forum nur Hilfestellungen gegeben werden sollen. Aber in diesem Fall ist vielleicht eine Ausnahme erlaubt. Im Code findest du weitere, kleine Anmerkungen.

Viele Grüße


Java:
public class Verwaltung
{
    private Node head;
    
    public static void main(String[] args) {
        Verwaltung vw = new Verwaltung();
        
        // 1. Fall : ticket == null
        System.out.println(vw.addTicket(null));   // false
        
        // 2. Fall: head == null
        System.out.println(vw.addTicket(
                vw.new Ticket("Schneider", "null Problemo")));   // true
        
        // Nun existiert die Liste und hat genau ein Ticket.
        
        // 3. Fall: head != null UND ticket != null
        // Du möchtest die Liste mit einer while-Schleife durchlaufen.
        // Wenn kein Ticket eingefügt wird, soll false an die Aufrufstelle
        // zurückgegeben werden (und umgekehrt). Richtig?
        System.out.println(vw.addTicket(
                vw.new Ticket("Müller", "null Problemo")));   // true
        System.out.println(vw.addTicket(
                vw.new Ticket("Schneider", "null Problemo")));    // false
    }

    public boolean addTicket(Ticket t) {
        if(t == null) {
            return false;
        }
        if(head == null) {
            head = new Node(t, null);
            return true;
        }
        
        // Zu diesem Zeitpunkt enthält die Liste mindestens ein Ticket.
        
        Node iter = head;   // So kann head weiter den Listenanfang referenzieren.
        boolean inserted = false;
        while(!inserted) {
            if(iter.getTicket().getKunde().equals(t.getKunde())
                    && iter.getTicket().getProblem().equals(t.getProblem())) {
                break;
            } else {
                iter = iter.getNext();   // null oder weiteres Ticket
                if(iter != null) {
                    iter = iter.getNext();   // die Suche geht weiter
                } else {
                    iter = new Node(t, null);
                    inserted = true;
                }
            }
        }
        return inserted;
    }
    
    class Ticket {
        String kunde;
        String problem;
        
        Ticket(String kunde, String problem) {
            this.kunde = kunde;
            this.problem = problem;
        }
        
        String getProblem() {
            return problem;
        }
        
        String getKunde() {
            return kunde;
        }
    }
    
    class Node {
        Ticket ticket;
        Node next;
        
        Node(Ticket ticket, Node next) {
            this.ticket = ticket;
            this.next = next;
        }
        
        Node() {}
        
        Ticket getTicket() {
            return ticket;
        }
        
        Node getNext() {
            return next;
        }
    }
    
}
 
Mir ist klar, dass in diesem Forum nur Hilfestellungen gegeben werden sollen. Aber in diesem Fall ist vielleicht eine Ausnahme erlaubt. Im Code findest du weitere, kleine Anmerkungen.
Wenn dir bereits klar ist, dass Komplettlösung nicht erlaubt sind, warum postest du eine solche dann? So etwas käme ja nicht mal mir in den Sinn. 🤞

Es geht in diesem Forum darum, möglichst ausschweifend und fern vom Code den Lösungsweg zu umschreiben.
 
Danke für Ihre Hilfe! Es ist, wie Kamil1 gesagt hat, nicht so gut, wenn Sie meine Aufgabe machen. Ich hätte da eine Frage bezüglich ihre Code. Könnte man die Zeile 45 und 46 weglassen und stattdessen
if(iter.getNext() != null) {
iter = iter.getNext();
schreiben?
 
Es geht in diesem Forum darum, möglichst ausschweifend und fern vom Code den Lösungsweg zu umschreiben.
Es geht vornehmlich im Anfängerbereich darum, den Leuten mit Hilfe zur Selbsthilfe zu helfen, weil niemand etwas lernt, wenn er eine fertige Lösung kopiert. Dafür nimmt sich der ein oder andere dann auch mal für ausschweifende Erklärungen Zeit. Wer nur am Kopieren fertiger Lösungen interessiert ist, findet diese meist auf StackOverflow.
 
Wenn dir bereits klar ist, dass Komplettlösung nicht erlaubt sind, warum postest du eine solche dann? So etwas käme ja nicht mal mir in den Sinn. 🤞

Es geht in diesem Forum darum, möglichst ausschweifend und fern vom Code den Lösungsweg zu umschreiben.
Sorry. Dachte es wär mehr eine Regel als ein Gesetz.
Es kommt nicht wieder vor.
 

Zurück
Oben