Beliebiges Element in einer Liste löschen (Java)?
Die Aufgabe lautet, dass wir ein beliebiges Element in einer Liste löschen können. Ich habe auch schon einen Ansatz. Doch ich komme jetzt leider nicht mehr weiter. Ich kann bisher nur das erste und letzte Element löschen. Doch noch keines in der Liste. Also das Dummy läuft durch die Queue bis zum vorletzten Element. Wenn nun der gesuchte Content mit dummy.getNext() übereinstimmt, dann soll gelöscht werden. Ich habe es auch schon so versucht zu programmieren aber irgendwie krieg ich es nicht ganz so hin, wie ich es mir vorgestellt habe.
Ist etwas in meiner Logik falsch oder etwas wie ich es programmiert habe? Kann mir wer helfen das weiter so zu programmieren? Danke
public void delete(String s) {
Node dummy = first;
Node last = getLast();
Node nach = getNext();
if(s.equals(first.getContent())) {
delete();
}
else if(getLast().getContent().equals(s)) {
delete();
}
while(!(dummy.getNext().getContent().equals(s))) {
delete();
dummy=dummy.getNext();
}
dummy.setNext(dummy.getNext().getNext());
}
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.
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
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
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;
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.
du kannst direkt list.remove(object) aufrufen, das liefert dir true zurück wenn das Element vorhanden war.
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
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));
}
}
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).
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.
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.