2017-05-21 3 views
-1

私は宿題の一部として自分のリンクリスト(およびリストノード)をJavaで書いていました。Javaのリンクリストから削除するには?

今、エントリを消去しようとしていますが、機能が動作していません。

私が概念を知っている:以前に保つノードに対して

  • 検索;
  • 前のノードに次のノードを指すように指示します。
  • ノードの使用を戻したり停止したりして、ノードを消去します。

何らかの理由で機能しません。私は同じ値を持つノードを何度も何度も削除することができます。私はそれがJavaポインタに関連する何かであると思う。

コード:

ノード:

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 
} 

一覧:

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

Javaのコンセプトは、オブジェクトに参照がなくなると、最終的にGCがクリーンアップするということです。あなたの場合、必要なのはあなたのLinkedListからオブジェクトを削除することだけです。 LinkedListから削除するには、を繰り返し、Iteratorから.remove()を呼び出します。 –

+0

ええ、私は上記のコードでそれをしようとしていますが、機能していません。 –

+0

remove: 'nodeAnt = this.head'で最初のノードをスキップしているようです。これは、最初のノードが見える前にすでに最初のノードが「前」であることを意味します。 – fileyfood500

答えて

1

複数の問題:あなたはリスト1,2,3,4を持っている場合

  1. を考えてみてください。今、1を削除しようとすると、コードが失敗します。
  2. nodeAnt = nodeは、nodeAnt = nodeAnt.getNext()である必要があります。 the'reすべての参照、ないオブジェクト

また、再帰的な方法が理解しやすいかもしれないが、覚えておいてください。私はそれを必要に応じて、私は、要素の出現をすべて削除します。たとえば、ここに私は

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()); 

} 

それを実装する方法です。違う必要があるかもしれません。

+0

本当にSystem.GCは必要ですか? –

+0

実際には、とにかく、メモリを解放するのはJVMにまったく依存しますが、私はそれを追加しました。違いはありません。 @TiagoSirious –

+0

"-XX:+ DisableExplicitGC"が設定されている場合、System.gc()は無視されます。 –

関連する問題