2016-08-28 4 views
1

Я пытаюсь удалить случайный узел из связанного списка или «сумку», так сказать. Пожалуйста, обратитесь к моему методу «T remove()». Я не могу заставить его удалить узел, не выбрасывая ошибку NullPointerException.Удаление неуказанного элемента из связанного списка

Сначала у меня есть метод, возвращающий NULL, если в нем нет ничего, чтобы начать с. Если узел существует, я перебираю числоNodes, нахожу случайный и пытаюсь удалить этот узел. Я делаю узел, который временно указывает на данные следующего узла и имеет предыдущий узел, указывающий на узел после 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

Ваши нулевые чеки должны быть в таком формате:. node1 == null Когда вы проверите его как node1.equals(null) и node1 фактически нулевой, вы «пытается вызвать метод объекта, который является недействительным и не будет, естественно, кинуть NullPointerException.

+0

Ничего себе, что помогло тонну, спасибо огромное! –

0

Это разрушает вещи для вас node1.equals(null), изначально ваших node1 = null, и вы спрашиваете нулевой узел для вызова equals метода, почему вы получаете nullpointerexception.

Итак, внесите изменения, и положите node1 == null

Смежные вопросы