双链接列表Java

双链接列表Java,java,nullpointerexception,doubly-linked-list,Java,Nullpointerexception,Doubly Linked List,这是一个带有sortedAdded和sortedRemove方法的双链接列表。当我运行代码时,它抛出“空点异常”。我知道第43行有异常,但我不知道如何修复它。我在这个网站上发了一篇关于如何“防止空点异常”的帖子,但还是没能做到正确。这是我的密码: public class DoublyLinkedList<Item extends Comparable> { private class Node{ private Item item; private Node ne

这是一个带有sortedAdded和sortedRemove方法的双链接列表。当我运行代码时,它抛出“空点异常”。我知道第43行有异常,但我不知道如何修复它。我在这个网站上发了一篇关于如何“防止空点异常”的帖子,但还是没能做到正确。这是我的密码:

public class DoublyLinkedList<Item extends Comparable> {

private class Node{
    private Item item;
    private Node next;
    private Node prev;

    public Node getNext() {
        return next;
    }

    public Node getPrev(){
        return prev;
    }

    public Item getItem(){
        return item;
    }

    public void setNext(Node next) {
        this.next = next;
    }

    public void setPrev(Node prev){
        this.prev= prev;
    }

    public void setItem(Item item){
        this.item = item;
    }
}

private Node head;
private int numberOfEelements;

public void sortedAdd(Item newItem) {
    Node dummy = head;
    Node current = dummy.getNext();
    while ((newItem.compareTo(current.getItem()) > 0) && (current != dummy))
        current = current.getNext();
    Node temp = new Node();
    temp.setNext(current);
    temp.setPrev(current.getPrev());
    (current.getPrev()).setNext(temp);
    current.setPrev(temp);
    temp.setItem(newItem);
    ++numberOfEelements;
}

public void sortedRemove(Item newItem) {
    Node dummy = head;
    Node current = dummy.getNext();
    while((newItem.compareTo(current.getItem()) !=0) && (current!= dummy))
        current = current.getNext();

    if (newItem.equals(current.getItem())) {
        (current.getPrev()).setNext(current.getNext());
        (current.getNext()).setPrev(current.getPrev());
        --numberOfEelements;
    }
}

public static void main(String[] args) {

    DoublyLinkedList<Integer> list = new DoublyLinkedList<Integer>();

        list.sortedAdd(1);
        list.sortedAdd(5);
        list.sortedAdd(7);
        list.sortedAdd(9);
        list.sortedAdd(3);
        list.sortedAdd(2);

        System.out.println(list);

        list.sortedRemove(3);
        list.sortedRemove(7);

        System.out.println(list);

        list.sortedRemove(4);
}
}

在sortedad中,您没有处理head==null的初始情况(在本例中,这意味着一个空列表)。因此在
dummy.getNext()行中您正在对空引用调用getNext

添加对创建空标头的空标头的检查应使您通过此错误:

public void sortedAdd(Item newItem) {

    if (head == null) {
        head = new Node();
        head.setItem(newItem);
        ++numberOfEelements;
        return;
    }
尽管由于循环逻辑的原因,您将在稍低的位置击中另一个NPE

为了打印列表,您需要添加一个toString()方法:


在sortedad中,您没有处理head==null的初始情况(在本例中,这意味着一个空列表)。因此在
dummy.getNext()行中您正在对空引用调用getNext

添加对创建空标头的空标头的检查应使您通过此错误:

public void sortedAdd(Item newItem) {

    if (head == null) {
        head = new Node();
        head.setItem(newItem);
        ++numberOfEelements;
        return;
    }
尽管由于循环逻辑的原因,您将在稍低的位置击中另一个NPE

为了打印列表,您需要添加一个toString()方法:


使用创建类型为
双链接列表
对象

DoublyLinkedList<Integer> list = new DoublyLinkedList<Integer>();

公共类双链接列表{
{
头=新节点();
head.setNext(head);
head.setPrev(head);
head.setItem(空);
元素数=0;
}
私有类节点{
私人物品;
私有节点下一步;
私有节点prev;
公共节点getNext(){
下一步返回;
}
公共节点getPrev(){
返回上一个;
}
公共项getItem(){
退货项目;
}
公共void setNext(节点next){
this.next=next;
}
公共void setPrev(节点prev){
这个.prev=prev;
}
公共无效集合项(项){
this.item=项目;
}
}
专用节点头;
私有整数元素;
已分类的公共空项(项新项){
节点虚拟=头部;
节点当前=dummy.getNext();
while((newItem.compareTo(current.getItem())>0)和&(current!=dummy))
current=current.getNext();
节点温度=新节点();
温度设置下一步(当前);
temp.setPrev(current.getPrev());
(current.getPrev()).setNext(temp);
当前设置Prev(温度);
临时设置项(新项);
++元素数量;
}
公共无效分类删除(项目新建项目){
节点虚拟=头部;
节点当前=dummy.getNext();
while((newItem.compareTo(current.getItem())!=0)和&(current!=dummy))
current=current.getNext();
if(newItem.equals(current.getItem())){
(current.getPrev()).setNext(current.getNext());
(current.getNext()).setPrev(current.getPrev());
--元素数量;
}
}

当使用创建类型为
双链接列表
对象时

DoublyLinkedList<Integer> list = new DoublyLinkedList<Integer>();

公共类双链接列表{
{
头=新节点();
head.setNext(head);
head.setPrev(head);
head.setItem(空);
元素数=0;
}
私有类节点{
私人物品;
私有节点下一步;
私有节点prev;
公共节点getNext(){
下一步返回;
}
公共节点getPrev(){
返回上一个;
}
公共项getItem(){
退货项目;
}
公共void setNext(节点next){
this.next=next;
}
公共void setPrev(节点prev){
这个.prev=prev;
}
公共无效集合项(项){
this.item=项目;
}
}
专用节点头;
私有整数元素;
已分类的公共空项(项新项){
节点虚拟=头部;
节点当前=dummy.getNext();
while((newItem.compareTo(current.getItem())>0)和&(current!=dummy))
current=current.getNext();
节点温度=新节点();
温度设置下一步(当前);
temp.setPrev(current.getPrev());
(current.getPrev()).setNext(temp);
当前设置Prev(温度);
临时设置项(新项);
++元素数量;
}
公共无效分类删除(项目新建项目){
节点虚拟=头部;
节点当前=dummy.getNext();
while((newItem.compareTo(current.getItem())!=0)和&(current!=dummy))
current=current.getNext();
if(newItem.equals(current.getItem())){
(current.getPrev()).setNext(current.getNext());
(current.getNext()).setPrev(current.getPrev());
--元素数量;
}
}

首先,当您在类节点结束后初始化head时-将该初始化替换为:
私有节点head=null;

现在使用以下代码:

public void sortedAdd(Item newItem) {
    Node dummy = head;
    if(dummy==null)
    {
        head = new Node();
        head.setItem(newItem);
        head.setNext(null);
        head.setPrev(head);

    }
    else
    {
        Node current = dummy.getNext();
        while ((newItem.compareTo(current.getItem()) > 0) && (current != dummy))
            current = current.getNext();
        Node temp = new Node();
        temp.setNext(current);
        temp.setPrev(current.getPrev());
        (current.getPrev()).setNext(temp);
        current.setPrev(temp);
        temp.setItem(newItem);
    }
    ++numberOfEelements;

}

首先,在类节点结束后初始化head时,将该初始化替换为:
private Node head=null;

现在使用以下代码:

public void sortedAdd(Item newItem) {
    Node dummy = head;
    if(dummy==null)
    {
        head = new Node();
        head.setItem(newItem);
        head.setNext(null);
        head.setPrev(head);

    }
    else
    {
        Node current = dummy.getNext();
        while ((newItem.compareTo(current.getItem()) > 0) && (current != dummy))
            current = current.getNext();
        Node temp = new Node();
        temp.setNext(current);
        temp.setPrev(current.getPrev());
        (current.getPrev()).setNext(temp);
        current.setPrev(temp);
        temp.setItem(newItem);
    }
    ++numberOfEelements;

}

指出您遇到问题的确切行,因为您提供的代码中没有行号(并且您的行号可能与我们自己复制并粘贴到编辑器中时得到的行号不同)。这是sortedad方法中的第二行。(节点current=dummy.getNext();)在将头部分配给假人之前,检查头部是否为空或空not@Toni在新的DoublyLinkedList中创建标题时,请查看我关于如何添加下一个和上一个引用的回答,指出您遇到问题的确切行,因为您提供的代码中没有行号(而且您的行号可能与我们自己复制并粘贴到编辑器中得到的行号不同)。这是sortedad方法中的第二行。(当前节点=dummy.getNext();)在将头部分配给假人之前,检查头部是否为空或空not@Toni在新的DoublyLinkedList中创建标题时,请查看我关于如何添加下一个和上一个引用的回答。我正在尝试这样做,但不知道如何做。如果您能提供更多帮助,我们将不胜感激。只添加了一个示例。
public void sortedAdd(Item newItem) {
    Node dummy = head;
    if(dummy==null)
    {
        head = new Node();
        head.setItem(newItem);
        head.setNext(null);
        head.setPrev(head);

    }
    else
    {
        Node current = dummy.getNext();
        while ((newItem.compareTo(current.getItem()) > 0) && (current != dummy))
            current = current.getNext();
        Node temp = new Node();
        temp.setNext(current);
        temp.setPrev(current.getPrev());
        (current.getPrev()).setNext(temp);
        current.setPrev(temp);
        temp.setItem(newItem);
    }
    ++numberOfEelements;

}