Einfach verkettete Liste: Wie Elemente löschen?

Status
Nicht offen für weitere Antworten.

titus

Mitglied
Ich habe den unten stehenden Code aus einer Übung, den ich geringfügig erweitert habe, was aber so wenig ist, dass es nicht nennenswert ist. :D

Nun habe ich die setNext()-Methode in der ListElem-Klasse dazu geschrieben, da sie zwar im Quellcode erwähnt wird, aber in meinen Unterlagen kurioserweise fehlt. Allerdings habe ich noch nicht prüfen können, ob meine Idee so funktioniert, denn es gibt ein anderes Problem ...

Wie lösche ich in so einer Liste ein Element? Ich bin völlig ratlos! :(

1. Ich vermute, dass ich die Liste komplett durchlaufen muss, z.B. mit einer FOR-Schleife, wie ich es in den Zeilen 91 bis 96 versuche - richtig?
2. Irgendwie muss ich ja angeben können, WAS gelöscht werden soll. Da war ich etwas ratlos, dachte mir aber, dass ich das in einer Object-Variable definieren könnte.

Aber dann... . Wie kann ich in der main-Klasse/-Methode nun die Liste nach dem zu löschenden Element durchlaufen? Eine Suche via FOR-Schleife, wie in der print()-Anweisung kann ich ja nicht durchführen, da ich ja nicht auf m_Head zugreifen kann. :(

Kann mir jemand bitte helfen?

Code:
package singlelist;

class SingleList {
    private ListElem m_Head;    // Anfang der Liste

    // Der Listen-Konstruktor ...
    public SingleList() {
        m_Head = null;  // ... erwartet kein Argument.
    }

    // Durchlauf und Ausgabe aller Elemente
    public void print() {
        /* Die Liste wird so lange durchlaufen, bis das letzte Element erfasst
         * und ausgegeben wurde - eben so lange, so lange elem != NULL ist. */
        for (ListElem elem = m_Head; elem != null; elem = elem.getNext()) {
            System.out.println(elem.getElement() + "\t");
        }
    }

    // Fügt ein Element in die Liste ein
    public void addElement(Object obj) {
        /* Das 1. Element ist das kürzlich eingefügte Element. Ein Nachfolger-
         * Element existiert nicht, folglich ist es sein eigener Nachfolger. */
        m_Head = new ListElem(obj, m_Head);
    }

    void deleteElem(ListElem pElem2Delete) {
        // Soll überhaupt ein Element gelöscht werden UND ist sie NICHT leer?
        if (pElem2Delete != null && m_Head != null) {
            // Soll das Start-Element gelöscht werden?
            if (m_Head == pElem2Delete) {
                // Setze das nächste Element als Start-Element
                m_Head = pElem2Delete.getNext();
            }
            else {
                for (ListElem tmp = m_Head; tmp != null; tmp = tmp.getNext()) {
                    ListElem tmpNext = tmp.getNext();Seite 1 von 40
                    /* Überprüft ob das nächste Element gelöscht werden soll.
                     * Dies ist nötig, um nach dem Löschen des jeweiligen
                     * Elements eine Verbindung zwischen dessen Nachfolger und
                     * dessen Vorgänger herstellen zu können. */
                    if (tmpNext == pElem2Delete) {
                        /* Falls ja, so wird der Zeiger vom Vorgänger des zu
                         * löschenden Elements auf dessen Nachfolger gesetzt */
                        tmp.setNext(tmpNext.getNext());
                        return; // ... und die Methode verlassen.
                    }
                }
            }
        }
    }

    // implementiert ein Listen-Element
    class ListElem {
        // Ein Listen-Element merkt sich ...
        private ListElem m_Next; // ... den Verweis auf das nächste Element ...
        private Object   m_Elem; // ... und das Element.

        // Der Konstruktor des Listen-Elements erwartet ...
        public ListElem(Object obj, ListElem next) {
            m_Next = next;  // ... den Verweis auf das nächste Element ...
            m_Elem = obj;   // ... und das zu speichernde Element.
        }

        // Liefert ein Element aus der Liste
        public Object getElement() {
            return m_Elem;
        }

        // Liefert den Verweis auf das nächste Element
        public ListElem getNext() {
            return m_Next;
        }

        public void setNext(ListElem next) {
            this.m_Next = next;
        }
    }
}

public class Main {
    public static void main(String[] args) {
        SingleList sl = new SingleList();   // Legt die Liste sl an
        // Fügt 200 Elemente in die Liste ein
        for (int i = -100; i < 100; ++i) {
            sl.addElement(new Integer(i));
        }
        // Druckt die Liste aus
        sl.print();

        Object elem2find = 10;

        for (SingleList.ListElem elem = SingleList.m_Head; elem != null; elem = elem.getNext()) {
            if (elem.getElement() == elem2find)
            sl.deleteElem(elem);
        }
    }

}
 
Zuletzt bearbeitet:

titus

Mitglied
Hat keiner eine Idee?

Ich hatte mir dann noch folgendes überlegt ...

Ich schreibe in der Klasse SingleList eine Methode, die ein Element sucht. Dort kann ich ja problemlos auf die Variable m_Head zugreifen und die Liste durchlaufen/durchsuchen. ...

Code:
class SingleList {
[...]

    public ListElem findElement(Object obj) {
        for (ListElem tmp = m_Head; tmp != null; tmp = tmp.getNext()) {
            System.out.println("DEBUG: " + tmp + ": " + tmp.getElement() + "; obj: " + obj);
            if (tmp.getElement() == obj) {
                System.out.print("GEFUNDEN!! :o)");
                return tmp;
            }
        }
        return null;
    }
}

...

Nun kann ich in der main ein Element definieren, nach dem gesucht werden, z.B. das erste Element mit dem Inhalt -100, das in die Liste Eingetragen wird. Wenn es gefunden wird, dann übergebe ich es später an die Methode, die für das löschen zuständig ist.

Code:
        Object elem2find = -100;
        sl.findElement(elem2find);

Das Problem ist jetzt nur, dass, obwohl die Inhalte miteinander verglichen werden und wie man in der Ausgabe sieht, auch gleich sind, diese nicht als gleich erkannt werden. Folglich kann die Such-Methode nix finden. :( Hat jemand eine Idee, woran das liegt? Liegt es an den beiden unterschiedlichen Datentypen ListElem und Object?
 

HLX

Top Contributor
Für einen inhaltlichen Vergleich musst du über die Methode equals(Object) vergleichen. Du vergleichst mit "==". Dabei wird lediglich überprüft, ob die gleiche Objektreferenz vorliegt.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
R einfach verkettete Liste Java Basics - Anfänger-Themen 1
R einfach verkettete Liste Java Basics - Anfänger-Themen 12
C Methoden Über eine einfach verkettete Liste Java Basics - Anfänger-Themen 8
O Einfach verkettete Liste - Revert Methode Java Basics - Anfänger-Themen 1
S Einfach verkettete Liste Element an bestimmter Position einfügen Java Basics - Anfänger-Themen 24
R Erste Schritte Verkettete Liste will einfach nicht in meinen Schädel Java Basics - Anfänger-Themen 11
K Einfach Verkettete Liste - addFirst() Java Basics - Anfänger-Themen 7
X Einfach verkettete Liste, keine Fehlermeldung Programm friert ein Java Basics - Anfänger-Themen 4
X Einfach Verkettete Liste Java Basics - Anfänger-Themen 16
K Datentypen Einfach/Doppelt verkettete Liste Java Basics - Anfänger-Themen 4
N einfach verkettete liste fehler Java Basics - Anfänger-Themen 5
N einfach verkettete liste Java Basics - Anfänger-Themen 3
B OOP Einfach verkettete Liste - rekursive Methoden Java Basics - Anfänger-Themen 1
S einfach verkettete Liste Java Basics - Anfänger-Themen 19
D Einfach verkettete Liste Java Basics - Anfänger-Themen 20
C einfach verkettete Liste -> Elemente vertauschen Java Basics - Anfänger-Themen 2
R einfach verkettete Liste, intersect Java Basics - Anfänger-Themen 4
E einfach verkettete liste, nullPointerException Java Basics - Anfänger-Themen 5
S Einfach-Verkettete-Listen Ausgabe zeigt nur 1. und letzte instanz Java Basics - Anfänger-Themen 2
V einfach verkettete Listen Java Basics - Anfänger-Themen 10
berserkerdq2 Wozu benötigt man den BiPredicate, kann ich nicht einfach eine normale Methode nutzen, statt BiPredicate? Java Basics - Anfänger-Themen 3
I Programm erkennt nicht an das Array zurückgegeben wird trotz Initialisierung *einfach* Java Basics - Anfänger-Themen 9
N Erste Schritte HelloWorld möchte einfach nicht laufen Java Basics - Anfänger-Themen 11
K Programm stoppt einfach ohne Grund Java Basics - Anfänger-Themen 4
N Best Practice Doppelte und einfach Anführungsstriche in Runtime.getruntime().exec() Java Basics - Anfänger-Themen 6
O Exception behandlung einfach Ueben mit Fakt! Java Basics - Anfänger-Themen 10
Hanschyo Programm schließt sich einfach Java Basics - Anfänger-Themen 2
S Einfach verkette Liste Java Basics - Anfänger-Themen 27
Hacer Operationen einfach verketteter Listen Java Basics - Anfänger-Themen 22
C Methoden Einfach verkette Liste - int Werte aufsteigend sortieren Java Basics - Anfänger-Themen 1
V Codezeile wird einfach nicht ausgeführt Java Basics - Anfänger-Themen 23
M Quadrat zeichnen einfach bitte! Java Basics - Anfänger-Themen 2
J Einfach verkettet List: Ausgabe ohne null Java Basics - Anfänger-Themen 11
N Einfacher Rechner (für mich nicht so einfach) Java Basics - Anfänger-Themen 5
M Array in ein Array übertragen (möglichst einfach) Java Basics - Anfänger-Themen 6
T Input/Output Daten/Objekte einfach speichern Java Basics - Anfänger-Themen 5
R Methoden... ich vesteh sie einfach nicht Java Basics - Anfänger-Themen 15
llabusch Verkette Listen - Einfach und Doppelt Java Basics - Anfänger-Themen 3
C Erste Schritte Problem mit der Division von Koeffizienten... oder einfach nur irgendwlechen zahlen Java Basics - Anfänger-Themen 10
D Klassen Klassen, Objekte, Konstruktor - einfach erklärt Java Basics - Anfänger-Themen 12
B Variable wird einfach so wieder auf "null" gesetzt Java Basics - Anfänger-Themen 12
T Elemente im Vector werden einfach überschrieben! Java Basics - Anfänger-Themen 3
S ich begreife es einfach nicht -> zweck der Schnittstellen Java Basics - Anfänger-Themen 27
J Interface Wie funktioniert das mit den Interfaces. Ich verstehe es einfach nicht! :( Java Basics - Anfänger-Themen 15
W Java-Programm als Icon mit Doppelklick einfach öffnen ? Java Basics - Anfänger-Themen 3
M Layout einfach bilden Java Basics - Anfänger-Themen 4
I Weiß einfach nicht mehr weiter... Java Basics - Anfänger-Themen 3
O Wie kann man das einfach lösen? (dynamisch viele Attribute) Java Basics - Anfänger-Themen 6
A If-Schleife spinnt - ganz einfach Code - Riesen Problem :) Java Basics - Anfänger-Themen 9
Luk10 einfach animation Java Basics - Anfänger-Themen 2
E JMC - Dlls einbinden - möglichst einfach Java Basics - Anfänger-Themen 8
I einfach verkette Liste Java Basics - Anfänger-Themen 9
H Typumwandlung String --> Int (ganz einfach) Java Basics - Anfänger-Themen 9
O Observer - Einfach erklärt? Java Basics - Anfänger-Themen 5
K Ich verstehe switch einfach nicht Java Basics - Anfänger-Themen 4
M jar-Datei einfach umbenennen? Java Basics - Anfänger-Themen 8
S Filewriter schreibt einfach nicht Java Basics - Anfänger-Themen 6
G Opjektorientierte Programmierung (OOP). einfach für euch Java Basics - Anfänger-Themen 4
X WAV conversion ist einfach nicht möglich Java Basics - Anfänger-Themen 2
J jar erstellen. Es klappt einfach nicht Java Basics - Anfänger-Themen 14
L Eingeben Rechnen Ausgeben - Leider nicht so einfach Java Basics - Anfänger-Themen 31
P einfach frage zur vererbung Java Basics - Anfänger-Themen 9
G Frank A. - ports einfach öffnen und schließen Java Basics - Anfänger-Themen 3
M Caeser Verschlüsselung ganz einfach(nicht für mich) Java Basics - Anfänger-Themen 6
L while wird einfach übersprungen? Java Basics - Anfänger-Themen 4
D einfach berechnung einer onlinezeit Java Basics - Anfänger-Themen 25
B Thread will einfach nicht stoppen Java Basics - Anfänger-Themen 12
B Packages einfach kopieren? Java Basics - Anfänger-Themen 13
N Mein Applet findet -online- einfach die Klasse nicht ! Java Basics - Anfänger-Themen 6
S Java rundet einfach auf 0 Java Basics - Anfänger-Themen 2
L Ein Bild auf ein JFrame legen. nicht so einfach? =( Java Basics - Anfänger-Themen 11
M Tablelayout einbinden - ich schaff's einfach nicht Java Basics - Anfänger-Themen 16
D Button Text will einfach nicht erscheinen Java Basics - Anfänger-Themen 6
M Methoden. ich versteh das einfach nicht! Bitte helfen! Java Basics - Anfänger-Themen 4
H Kann man in Java einfach einen Beep erzeugen Java Basics - Anfänger-Themen 2
C einfach aber komisch Java Basics - Anfänger-Themen 5
P Restart Button für einfach Applikation Java Basics - Anfänger-Themen 7
H RAF geht einfach nicht Java Basics - Anfänger-Themen 12
D RegEx Probleme - wahrscheinlich zu einfach. Java Basics - Anfänger-Themen 2
H Einfach Datenübergabe Java Basics - Anfänger-Themen 4
S RegEx Syntax - ich verstehe sie einfach nicht! Java Basics - Anfänger-Themen 3
V Teil eines Programms funktioniert einfach nicht Java Basics - Anfänger-Themen 2
V If Schleife wird beim ausführen einfach ignoriert Java Basics - Anfänger-Themen 4
D Einfach Leerzeile einfügen ? Java Basics - Anfänger-Themen 2
G Owner von JDialog;Komme einfach nicht weiter Java Basics - Anfänger-Themen 4
B Applet geht einfach nicht Java Basics - Anfänger-Themen 16
S UIManager kann einfach nicht aufgelöst werden Java Basics - Anfänger-Themen 4
R Einfach if-Abfrage Java Basics - Anfänger-Themen 7
B Eine Linie zeichnenmit Java, ich verstehe das einfach nicht Java Basics - Anfänger-Themen 4
A Einfach, gut erklärte Übungen!!! Java Basics - Anfänger-Themen 3
M Verkettete Liste Java Basics - Anfänger-Themen 1
H Java verkettete Liste, Wert eines Index zurückgeben Java Basics - Anfänger-Themen 1
Igig1 Autoparkplatz verkettete Liste erstes und letztes Auto Java Basics - Anfänger-Themen 13
R Rückgabe: verkettete Liste Java Basics - Anfänger-Themen 2
B Verkettete Liste durchgehen und einzelne Elemente in neue Liste tun Java Basics - Anfänger-Themen 9
B Bin komplett am verzweifeln :( Verkettete Liste die Objekte hat Attribut auslesen Java Basics - Anfänger-Themen 14
Y Einfügen in eine doppelt verkettete Liste Java Basics - Anfänger-Themen 8
A Doppelt verkettete Liste rückwärts ausgeben Java Basics - Anfänger-Themen 17
D Doppelt Verkettete Zirkular-Liste Java Basics - Anfänger-Themen 1
A Verkettete Liste Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben