我正在尝试从链接列表或“包”中删除随机节点。请参考我的方法“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是从我的构造函数类
调用我的'remove()'方法的方法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 :(得分:3)
您的空检查应采用以下格式:node1 == null
。当您将其检查为node1.equals(null)
,并且node1实际上为null时,您正在尝试调用对象的方法,该方法为null并且自然会抛出NullPointerException。
答案 1 :(得分:0)
这会破坏您node1.equals(null)
的内容,最初是您的node1 = null
,并且您要求空节点调用equals
方法,这就是您获取nullpointerexception
的原因。
所以,请进行更改,然后添加node1 == null