Я пытаюсь удалить случайный узел из связанного списка или «сумку», так сказать. Пожалуйста, обратитесь к моему методу «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);
}
}
Сообщите нам Если это не помогает, обновите ошибку Если возможно. – Jordon