0

リンクされたリストから要素を削除するには?

それは正しい方法ですか:

public E remove(E element) {
        Node search = currentNode;
        boolean nonStop = true;
        while(((search.previous) != null) && (nonStop)) {
            if(search.previous.toString().equals(element.toString())) {
                System.out.println("Item found !!!");
                search.previous = search.previous.previous;
                nonStop = false;
            } else {
                search = search.previous;
            }
        }
        currentNode = search;
        return null;
    }

public class Node<E> {
    public E data;
    public Node<E> previous;

    public Node(E data) {
        this.data = data;
    }

    public void printNode() {
        System.out.println("Node details: "+data);
    }

    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return (String)data;
    }

}

問題は、すべての要素を印刷しているときに、getAllElements() が正しい答えを返さないことです。remove() メソッドまたは getAllElements に問題はありますか?

public void getAllElements() {
        Node<E> aNode = currentNode;
        while(aNode != null) {
            aNode.printNode();
            aNode = aNode.previous;
        }
    }
4

5 に答える 5

1

これを試して:

public void remove(E element)
{
    Node n = head;  // This is the head of the linked list-- It is the starting node of your linked list: For your case "currentNode"
    Node tmp;
    while(n!=null && !n.data.equals(element))
    {
        tmp = n;
        n = n.previous;
    }

    if(n==null)
    {
        // Do your stuff
        System.out.println("Element "+element+" not found.");
    }
    else
    {
        // Do your stuff
        tmp.prev = n.prev;
        n.prev = null;
        System.out.println("Element "+element+" removed.");
    }
}


// Suggestion: This method name should be "printList()"
public void getAllElements()
{
    Node n = head;      // In your case: "currentNode"
    while(n!=null)
    {
        n.printNode();
        n = n.previous;
    }   
}
于 2013-07-12T09:08:30.440 に答える
1

remove メソッドは実際には何も削除しないようです。メソッド内のポインターを更新して、削除する要素を何も指さないようにする必要があります。その後、ガベージ コレクターは、何も指していない要素を削除します。私が何を意味するかを説明するためのいくつかの擬似コード:

public remove(Element element){
  for (Element e : myLinkedList){
    if (e.equals(element)){
      if (next != 0)
        previousPtr = nextPtr;
      else
        previousPtr = null;
    }
  }
}

これは正しい Java コードではないことに注意してください。アイデアを提供するための疑似コードです。:)

于 2013-07-12T08:20:45.007 に答える
1

この線

if(search.previous.toString().equals(element.toString())

要素ではなくノードで string を呼び出します。

于 2013-07-12T07:42:15.697 に答える
0

あなたの要素には何らかの識別子がありませんか? 次に、次のように、はるかに簡単に行うことができます:オブジェクトを削除します。

于 2013-07-12T07:40:54.763 に答える