2016-04-13 12 views
0

リンクリストから条件を満たす複数のノードを削除しようとしています。プログラムはちょっと複雑なので、私はそれの要点を述べるでしょう。私のリンクリスト内のノードは、次の特性(番号に関連付けられている名前)を持つ:リンクリストから複数のノードを削除するjava

Name Number 
Dog  1 
Cat  1 
Rat  2 
Donkey 3 
Fish 1 

私は私の削除機能1.数でノードを削除できるようにしたい:

public void Delete(Int N) { 

     Node current = Head; 
     Node previous = Head; 


     while (current.getNum() != N) { 

      if (current.getNextNode() == null) { 

       System.out.print("Not found"); 

      } else { 

       previous = current; 

       current = current.getNextNode(); 

      } 

     } 

     if (current == Head) { 

      Head = Head.getNextNode(); 

     } else { 

      Node A = current.getNextNode(); 
      previous.setNextNode(A); 

     } 

    } 

これは機能しますが、最初のオカレンスだけが削除されます。私は、それが適切でないか、適切なループ構造が原因である可能性があることを知っていますが、私はこれを何時間も働いており、途中で混乱しています。私は手動でトレーステーブルを実行しようとしましたが、どちらも動作していません。

リンクリスト全体をループし、基準に一致するノードを削除するように、関数をどのように編集できますか?あなたはリスト全体を移動したい場合は

​​

答えて

0

あなたのループwhile (current.getNum() != N)数Nを持つノードの最初の発生後に終了します:

1

これは、リンクされたリストから一致するNodeインスタンスを削除する必要がありますループは次のようになります

while (current != null) { 
    //do something with the list 
    current = current.getNextNode(); 
} 

この場合、特にノードを削除する必要があります。あなたのLinkedList内のノードを削除したい場合は

Node prev = null; 
while (current != null) { 
    Node next = current.getNextNode() 
    if(current.getNum() == N){ 
     //condition to remove current node has been found. 
     if(prev == null){ 
      Head = next; 
     } else { 
      prev.setNextNode(next); 
     } 
    } else { 
     //only advance prev if we haven't deleted something 
     prev = current; 
    } 
    current = current.getNextNode(); 
} 
0

、あなたは

  1. のみNに等しいされていない数のノードを持つ新しいリンクリスト、次のいずれかの方法を使用することができます
  2. または既存のものを変更してください。

私は数がNに等しいされていない要素を持つ新しいリンクリストを作成し、最初の方法を使用していた

class Node { 

    public String name; 
    public int number; 
    public Node next; 
} 

public class LinkedListTest { 

    public static void main(String[] args) { 

     LinkedListTest obj = new LinkedListTest(); 
     Node head = obj.createLinkList(); 
     Node startPointer = head; 
     while (startPointer != null) { 

      System.out.println(startPointer.name + " " + startPointer.number); 
      startPointer = startPointer.next; 
     } 
     System.out.println("***********"); 
     Node newNodeHead = obj.deleteNode(1, head); 
     startPointer = newNodeHead; 
     while (startPointer != null) { 

      System.out.println(startPointer.name + " " + startPointer.number); 
      startPointer = startPointer.next; 
     } 

    } 

    public Node deleteNode(int n, Node head) { 

     Node current = head; 
     Node newNodestartPointer = null; 
     Node newNodeCurrent = null; 
     while (current != null) { 

      if (!(current.number == n)) { 

       if (newNodestartPointer == null) { 
        newNodestartPointer = new Node(); 
        newNodestartPointer.name = current.name; 
        newNodestartPointer.number = current.number; 
        newNodestartPointer.next = null; 
        newNodeCurrent = newNodestartPointer; 
       } else { 

        Node newNode = new Node(); 
        newNode.name = current.name; 
        newNode.number = current.number; 
        newNodeCurrent.next = newNode; 
        newNodeCurrent = newNode; 
       } 
      } 
      current = current.next; 
     } 

     return newNodestartPointer; 
    } 

    public Node createLinkList() { 

     Node head = null; 

     Node newNode = new Node(); 
     newNode.name = "Dog"; 
     newNode.number = 1; 
     newNode.next = null; 

     head = newNode; 

     newNode = new Node(); 
     newNode.name = "Cat"; 
     newNode.number = 1; 
     newNode.next = null; 
     head.next = newNode; 
     Node prevNode = newNode; 

     newNode = new Node(); 
     newNode.name = "Rat"; 
     newNode.number = 2; 
     newNode.next = null; 
     prevNode.next = newNode; 
     prevNode = newNode; 

     newNode = new Node(); 
     newNode.name = "Donkey"; 
     newNode.number = 3; 
     newNode.next = null; 
     prevNode.next = newNode; 

     return head; 
    } 
} 
関連する問題