Beliebiges Element in einer Liste löschen (Java)?

3 Antworten

Die Variable nach kannst du zunächst einmal löschen. Du verwendest sie ja nirgendwo.

Den ersten und letzten Knoten kannst du zwar im Voraus prüfen, nur solltest du danach auch die Methode beenden und nicht nochmals durch die Liste laufen, um etwas zu löschen.

Bei dieser Methodenkette:

dummy.getNext().getContent()

würde ich an deiner Stelle aufpassen. Zum einen kann getNext den Wert null zurückgeben, weil du am Ende der Liste angekommen bist und zum anderen kann getContent ganz sicher auch den Wert null liefern (es sei denn, deine Liste trägt genau Sorge dafür, dass nie ein Listenelement auf den Wert null zeigt).

Was deine delete-Methode genau macht, wäre wohl interessant. Ich frage mich, woher sie wissen soll, welches Element gerade zu löschen wäre. In der Schleife sollte sie des Weiteren keinesfalls stehen, weil sie doch sonst so lange ausgeführt wird, bis das eigentlich zu löschende Element gefunden wurde.

Prinzipiell solltest du zuerst den Nachfolger des zu löschenden Elements ermitteln, sowie dessen Vorgänger. Dann kannst du den gefundenen Nachfolger zum Nachfolger des Vorgängers machen. Wenn dieser Strang gesichert ist, kann das zu löschende Element auf den Wert null gesetzt werden, damit der GC weiß, wo er demnächst Speicherplatz leer räumen kann.

Thomlol 
Fragesteller
 12.04.2020, 23:26

Hi, also ich bin jetzt etwas weitergekommen weiß aber noch nicht ganz wie ich das nun schreiben soll. Bei der Methode delete() wird der Pfeil, welcher auf das erste Elemente zeigt auf das Nächste gerichtet.

public void delete() {
        first = first.getNext();
}

    Doch ich weiß wenn zum Beispiel in der Liste (a->b->c->d) c gelöscht werden soll, dass der pointer von b auf d umgeleitet werden muss heißt, dass ich irgendwie ja ne neue delete Methode braucht, in welche dann sowas steht wie Vorgänger.getNext() = current.getNext() sodass nun wie im Beispiel c nun d ist und auf c kein Pfeil mehr zeigt, doch so genau weiß ich auch nicht wie ich das programmieren soll.

0
regex9  12.04.2020, 23:41
@Thomlol

Eine eigene delete-Methode brauchst du erst einmal nicht. Wenn doch, sollte sie zumindest die notwendigen Parameter aufnehmen (das zu löschende Element sowie seinen Vorgänger).

Schau zunächst einmal, dass du den Vorgänger findest. Es ist der einzige Wert, der vorerst berechnet werden muss.

Und ja, den Fall, dass es in der Liste nur ein Element gibt (welches vielleicht sogar dem gesuchten Wert entspricht), musst du ebenfalls berücksichtigen.

wenn start == ende und start.inhalt == zu löschender Wert
0
Thomlol 
Fragesteller
 13.04.2020, 00:00
@regex9

Um ehrlich zu sein komme ich gerade nicht ganz mit. Wie finde ich denn den Vorgänger. Wenn jetzt die while Schleife beim passenden Element ist was muss dann gemacht werden?

while(!(dummy.getNext().getContent().equals(s))) {
            ? 
}

       Muss ich Vorgänger erstmal vorher deklarieren so wie Node last = getLast()?

Und was muss ich jetzt nach der while Schleife schreiben? Da muss ja sowas hin, was ich vorhin geschrieben habe also:

while(!(dummy.getNext().getContent().equals(s))) {
            vorgänger.getNext() = vorgänger.getNext().getNext()
        }

Oder ist es so nicht richtig? Könntest du mir bitte sagen wie ich es schreiben muss, denn vom theoretischen her ist es mir eigentlich klar

0
regex9  13.04.2020, 00:22
@Thomlol
if (valueToRemove == null) {
  return false;
}

Node current = first;

if (valueToRemove.equals(current.getContent()) {
  first = first.getNext();
  return true;
}

while (current.getNext() != null && !valueToRemove.equals(current.getNext().getContent()) {
  current = current.getNext();
}

if (current == end) {
  return false;
}

Node nodeToRemove = current.getNext();
Node follower = nodeToRemove.getNext();
current.setNext(follower);
nodeToRemove = null;

return true;
0
Thomlol 
Fragesteller
 14.04.2020, 22:16
@regex9

Sehr nett vielen dank ich hätte allerdings eine Frage..Wofür steht genau die null also wofür steht zum Beispiel valueToRemove == null? Was bedeutet es, wenn der gesuchte Wert 0 ist? Außerdem kennt meine Klasse die Variable end nicht.

0
regex9  14.04.2020, 22:26
@Thomlol

1) Wenn eine Referenz auf null zeigt, zeigt es auf nichts. Dann existiert kein Objekt an dieser Stelle.

Wenn der Nutzer ein nicht existentes Objekt übergibt, handhabt die Methode diesen Fall, indem sie das Feedback zurückgibt, dass der Vorgang nicht erfolgreich war (false). Danach ist auch dieser Aufruf: valueToRemove.equals sicher durchführbar. Mir fällt nur gerade auf, dass du ebenso eine Abfrage einbauen solltest, ob es überhaupt ein Element in der Liste gibt.

if (valueToRemove == null || first == null) {
  return false;
}

2) end stellt den letzten Knoten der Liste dar.

0
VFynn0033  14.04.2020, 23:04
@regex9

Aber leider kennt meine Klasse end nicht. Wie schreibe ich es so um, dass sie es kennt?

0

du kannst direkt list.remove(object) aufrufen, das liefert dir true zurück wenn das Element vorhanden war.

Woher ich das weiß:Berufserfahrung – Dipl.-Informatiker mit 10 Jahren Berufserfahrung
Thomlol 
Fragesteller
 12.04.2020, 21:28

Das möchte ich aber nicht. Ich möchte ein Objekt was ich löschen möchte eingeben können. Ich möchte schon mit meiner Methode weiterarbeiten und da brauche ich Hilfe

0
Freestila  12.04.2020, 23:30
@Thomlol

Du hast eine Liste von Strings, und möchtest den String s löschen, oder? Dann sollte list.remove(s) funktionieren und genau das machen was du willst.

0
import java.util.ArrayList;

import org.apache.commons.lang3.StringUtils;




public class test{

	public static void main(String[] args) {

		String[] cars = {"Volvo", "BMW", "Ford", "Mazda"};

		System.out.println("Original Array : größe : "

                + cars.length );

    System.out.println("Inhalt : " + Arrays.toString(cars));

    //entfernen vom element an index 2 (Ford)

    cars = ArrayUtils.remove(cars, 2);

    System.out.println("Größe des Arrays nach der Entfernung eines Elements : " + cars.length);

    System.out.println("Inhalt des Arrays nach der Entfernung eines Elements : " + Arrays.toString(cars));

	}

}
Woher ich das weiß:Studium / Ausbildung – Informatikstudent
regex9  12.04.2020, 21:34

Dein Beispiel zeigt, wie man mit Apache Commons ein Element aus einem Array entfernt. Der FS fragt explizit nach einer Liste, die er zudem selbst implementiert hat (ersichtlich an der Klasse Node).

1