从链接列表中删除未指定的项目

时间:2016-08-28 19:59:52

标签: java linked-list

我正在尝试从链接列表或“包”中删除随机节点。请参考我的方法“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);



     }
}

2 个答案:

答案 0 :(得分:3)

您的空检查应采用以下格式:node1 == null。当您将其检查为node1.equals(null),并且node1实际上为null时,您正在尝试调用对象的方法,该方法为null并且自然会抛出NullPointerException。

答案 1 :(得分:0)

这会破坏您node1.equals(null)的内容,最初是您的node1 = null,并且您要求空节点调用equals方法,这就是您获取nullpointerexception的原因。

所以,请进行更改,然后添加node1 == null