2017-05-21 5 views
-1

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. 
} 
+0

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. –

+0

Ja, aber ich versuche das im obigen Code zu tun, aber es funktioniert nicht. –

+0

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

Antwort

1

mehrere Probleme:

  1. Denken Sie, wenn Sie eine Liste 1,2,3,4 haben. Wenn Sie versuchen, 1 zu entfernen, schlägt Ihr Code fehl.
  2. nodeAnt = node sollte nodeAnt = nodeAnt.getNext() sein. Denken Sie daran, alle Verweise Hause genauso geschaffen, Objekte nicht

Auch könnte eine rekursive Art und Weise leichter zu verstehen. Hier ist zum Beispiel, wie ich es umgesetzt

public void remove(E e){ 
    prev = head; 
    removeElement(e, head); 
    System.gc(); 
} 

private void removeElement(E e, Node currentElement) { 
    if(currentElement==null){ 
     return; 
    } 
    if(head.getData().equals(e)){ 
     head = head.getNext(); 
     size--; 
    }else if(currentElement.getData().equals(e)){ 
     prev.setNext(currentElement.getNext()); 
     size--; 
    } 
    prev = prev.getNext(); 
    removeElement(e, currentElement.getNext()); 

} 

Hinweis: Ich lösche alle Vorkommen des Elements, wie ich es brauchte. Möglicherweise müssen Sie es anders haben.

+0

Ist System.GC wirklich notwendig? –

+0

tatsächlich, nein. Es ist total Sache der JVM, wann Speicher freizugeben, aber ich habe es trotzdem hinzugefügt. Macht keinen Unterschied. @TiagoSirious –

+0

System.gc() wird ignoriert, wenn "-XX: + DisableExplicitGC" gesetzt ist –

Verwandte Themen