删除链接列表中的节点

时间:2012-03-09 15:34:31

标签: java nodes doubly-linked-list

现在尝试按索引删除节点。我想打印带索引的节点列表,以便用户可以选择索引。我认为我的逻辑可以打印带有索引的列表,但没有输出:(

有一次愚弄这个,我仍然无法打印节点列表,但输出了“输入你要删除的索引”,并且能够进行用户选择,但最终得到了NullPointerException 。

            else if (menu.equals("d")) {
            EntryNode temp = head;
            while (temp != null) {
                for (int i = 0; i < addressBook.length(); i++) {
                    //gets node at index
                    System.out.println(temp.getFirstName() + i);
                    temp = temp.getNext();
                }
            System.out.println(" ");
            System.out.println("Please enter the index of the entry you wish to delete ");
            int index = keyboard.nextInt();
            addressBook.removeEntry(index);
            }

        }

删除方法:         public void removeEntry(int index){

    //delete from the head
    if (index == 0) {
        EntryNode temp = head;
        head = temp.getNext();
        temp.setNext(null);
        head.setPrev(null);
        size--;
    }
    //delete from the tail
    else if (index == length()) {
        EntryNode temp = tail;
        temp.setPrev(null);
        tail.setNext(null);
        tail = temp.getPrev();

        size--;
    }
    //in the middle
    else {
        EntryNode temp = head;
        for (int i = 0; i < index; i++) {
            //gets node at index
            temp = temp.getNext();
        }
        //set node after temp's previous to temp's previous 
        temp.getNext().setPrev(temp.getPrev());
        temp.getPrev().setNext(temp.getNext());
        temp.setNext(null);
        temp.setPrev(null);
        size--;
    }
}

NullPointerException来自:

//set node after temp's previous to temp's previous 
temp.getNext().setPrev(temp.getPrev());

2 个答案:

答案 0 :(得分:2)

在调用temp.getNext()之前,您应该检查null是否不是setPrev()

此外,您应该检查length()-1,因为您拥有零索引的节点。

答案 1 :(得分:1)

指数在[0, length() - 1]范围内,因此您应该使用

else if (index == length() - 1) {

代替。