Also schrieb ich meine eigene verknüpfte Liste (und Listenknoten) in Java als Teil einer Hausaufgabe.So entfernen Sie aus einer Linked-Liste in Java?
Jetzt versuche ich Einträge zu löschen, aber die Funktion funktioniert nicht.
weiß, dass ich das Konzept:
- Suche nach Knoten der vorherigen halten;
- Erklären Sie dem vorherigen Knoten, auf den nächsten Knoten zu zeigen;
- Geben Sie den Knoten zurück oder stoppen Sie ihn, damit GC ihn löscht.
Aus irgendeinem Grund funktioniert es nicht. Ich kann den Knoten immer wieder mit dem gleichen Wert löschen. Ich fürchte, dass es etwas mit Java-Zeigern zu tun hat.
Der Code:
Knoten:
public class SimpleNode<E> {
private E value;
private SimpleNode<E> next;
public SimpleNode() {
this.value = null;
this.next = null;
}
public NoSimples(E data, SimpleNode<E> ref) {
this.value = data;
this.next = ref;
}
// Getters and Setters
}
Liste:
public class LinkedList<E> implements Iterable<SimpleNode<E>> {
private SimpleNode<E> head;
private int size = 0;
public LinkedList() {
this.head = new SimpleNode<E>();
}
public void add(SimpleNode<E> node) {
this.addFirst(node.getValue());
}
public void addFirst(E item) {
SimpleNode<E> nonde = new SimpleNode<E>(item, this.head);
this.head = node;
size++;
}
public void add(E value) {
this.addFirst(value);
}
public SimpleNode<E> removeFirst() {
SimpleNode<E> node = this.head;
if (node == null) {
return null;
} else {
this.head = node.getNext();
node.setNext(null);
this.size--;
return node;
}
}
public SimpleNodes<E> remove(E value) {
SimpleNode<E> nodeAnt = this.head;
SimpleNode<E> node = this.head.getNext();
while (node != null) {
if (node.getValue()!= null && node.getValue().equals(value)) {
nodeAnt.setNext(node.getNext());
node.setNext(null);
return node;
}
nodeAnt = node;
node = node.getNext();
}
return null;
}
// Other irrelevant methods.
}
Das Konzept in Java ist, dass, wenn ein Objekt keine Referenzen mehr hat, der GC es schließlich aufräumen wird. In Ihrem Fall ist alles, was Sie brauchen, um das Objekt von Ihrer LinkedList zu entfernen, und das ist es. Um von der LinkedList zu entfernen, müssen Sie nur durch den Iterator navigieren und .remove() aufrufen. –
Ja, aber ich versuche das im obigen Code zu tun, aber es funktioniert nicht. –
Es sieht so aus, als würden Sie den ersten Knoten in remove überspringen: 'nodeAnt = this.head'. Dies bedeutet, dass der erste Knoten bereits "Anterior" ist, bevor Sie ihn überhaupt betrachtet haben. – fileyfood500