2016-08-28 7 views
1

リンクリストからランダムなノードを削除しようとしています。私のメソッド「T remove()」を参照してください。私はそれがNullPointerExceptionエラーをスローせずにノードを削除することはできません。リンクリストから不特定のアイテムを削除する

まず、リストに何もない場合は、NULLを返します。ノードが存在する場合は、numberofNodesをループし、ランダムなノードを見つけてそのノードを削除しようとします。私は一時的に次のノードのデータを指すノードを作って、前のノードが存在するかのようにcurrentNodeの後のノードを指し示すようにします。

私のロジックは間違っていますか?

private class Node{ 

     private T entry; 
     private Node next; 

     private Node(T entryPortion) 
     { 
      this(entryPortion, null); 
     } 

     private Node(T entryPortion, Node nextNode) 
     { 
      entry = entryPortion; 
      next = nextNode; 
     } 

    } 

    private Node node1; 
    private Node lastNode; 
    private int numItems; 

    public LinkedBag() //Establishes an empty bag 
    { 
     node1 = null; 
     numItems = 0; 
    } 

    @Override 
    public int getCurrentSize() 
    { 
     // Gets Size of Bag 
     return numItems; 
    } 

    @Override 
    public boolean isFull() 
    { 
     //Checks to see if bag is full, however since it is linked list there is no specified max size. Although maximum memory can be reached 
     return true; 
    } 

    @Override 
    public boolean isEmpty() { 
     // Checks to see if bag is empty 
     return node1 == null; 
    } 

    @Override 
    public boolean add(T newItem) { 
     // Adds something to the bag 
     Node newNode = new Node(newItem); 
     newNode.next = node1; 

     node1 = newNode; 
     numItems++; 
     return true; 
    } 

    @Override 
    public T remove() { 
     // Removes random item from bag 

     if(node1.equals(null)) 
     { 
      return null; 
     } 

     else 
     { 
     int randItem = new Random().nextInt(numItems); 
     Node currentNode = node1; 
     Node previousNode = node1; 
     for (int i = 0; i < randItem; i++) 
      { 
      previousNode = currentNode; 
      currentNode = currentNode.next; 
      } 
      previousNode.next = currentNode.next; 
      currentNode.next = null; 
      numItems--; 

      return null; 

     } 

     /*if (numItems == 0) 

      return null; 
     } 
     else 
     { 
      Node temp = node1; 
      node1 = node1.next; 
      numItems--; 
      //if(node1 == null) 
       //lastNode = null; 
      return temp.entry; 

     }*/ 

    } 

    @Override 
    public boolean remove(T anItem) { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public void clear() { 


    } 

    @Override 
    public int getFrequencyOf(T anItem) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public boolean contains(T anItem) { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public T[] toArray() { 
     // Converts items in linked list to an array for easy displaying 
     @SuppressWarnings("unchecked") 
     T[] result = (T[])new Object [numItems]; 

     int i = 0; 
     Node currentNode = node1; 
     while((i<numItems)&&(currentNode != null)) 
     { 
      result[i] = currentNode.entry; 
      i++; 
      currentNode = currentNode.next; 
     } 
     return result; 
    } 




} 

これは私が使用するテストプログラムです。 「testRemoveは私のコンストラクタクラスから私の 『削除()』メソッドを呼び出す方法です

public class LinkedBagTest { 

    public static void main(String[] args) { 

     System.out.println ("Creating an empty bag."); 
      BagInterface <String> aBag = new LinkedBag <String>(); 
      displayBag (aBag); 
      testNumItems(aBag); 
      testRemove(aBag); 
      String [] contentsOfBag = {"A", "D", "B", "A", "C", "A", "D"}; 
      testAdd (aBag, contentsOfBag); 
      testNumItems(aBag); 
      testRemove(aBag); 
      displayBag (aBag); 
      testRemove(aBag); 
      displayBag (aBag); 
      //testIsFull(aBag, false); 


    } 
    private static void testAdd (BagInterface <String> aBag, 
       String [] content) 
     { 
      System.out.print ("Adding to the bag: "); 
      for (int index = 0 ; index < content.length ; index++) 
      { 
       aBag.add (content [index]); 
       System.out.print (content [index] + " "); 
      } // end for 
      System.out.println(); 
      displayBag (aBag); 
     } // end testAdd 

    private static void displayBag (BagInterface <String> aBag) 
     { 
      System.out.println ("The bag contains the following string(s):"); 
      Object [] bagArray = aBag.toArray(); 
      for (int index = 0 ; index < bagArray.length ; index++) 
      { 
       System.out.print (bagArray [index] + " "); 
      } // end for 
      System.out.println(); 
     } // end displayBag 

    private static void testIsFull (BagInterface <String> aBag, 
      boolean correctResult) 
    { 
     System.out.print ("\nTesting the method isFull with "); 
     if (correctResult) 
      System.out.println ("a full bag:"); 
     else 
      System.out.println ("a bag that is not full:"); 
     System.out.print ("isFull finds the bag "); 
     if (correctResult && aBag.isFull()) 
      System.out.println ("full: OK."); 
     else if (correctResult) 
      System.out.println ("not full, but it is full: ERROR."); 
     else if (!correctResult && aBag.isFull()) 
      System.out.println ("full, but it is not full: ERROR."); 
     else 
      System.out.println ("not full: OK."); 
    } // end testIsFull are here. 

    private static void testNumItems (BagInterface <String> aBag) 
    { 
     int items = aBag.getCurrentSize(); 
     System.out.println("There are " + items + " items in the bag"); 
    } 

    private static void testRemove (BagInterface <String> aBag) 
    { 
     aBag.remove(); 
     System.out.println("An Item was removed"); 

     testNumItems(aBag); 



    } 
} 
+0

私たちに教えてくださいうまくいかない場合は、可能であればエラーを更新してください。 – Jordon

答えて

3

あなたはnullチェックはこの形式でなければなりません:。node1 == nullあなたはnode1.equals(null)として、それをチェックして、ノード1は、あなた実際にnullであります「再nullで、自然にNullPointerExceptionがスローされたオブジェクトのメソッドを呼び出そうと。

+0

うわー、お世話になりました。ありがとう! –

0

これはあなたのnode1 = null最初に、あなたnode1.equals(null)のために何かを台無しにされ、そしてあなたがequalsメソッドを呼び出すために、ヌルノードを求めている、そのなぜあなたはnullpointerexceptionを得ているのですか?

変更してください。node1 == null

関連する問題