Java 从双链接列表中删除元素时出现空指针异常

Java 从双链接列表中删除元素时出现空指针异常,java,data-structures,nullpointerexception,Java,Data Structures,Nullpointerexception,当我尝试删除某些索引的任何元素时,代码运行良好,但对于其他一些索引,代码不起作用。例如,每当我试图通过传递delete(1)来删除时,它可能会工作,如果我尝试通过delete(2)来删除,它可能会显示NullPointerException。代码如下: Node head; public void insert(int data) { Node node = new Node(); node.data = data;

当我尝试删除某些索引的任何元素时,代码运行良好,但对于其他一些索引,代码不起作用。例如,每当我试图通过传递
delete(1)
来删除时,它可能会工作,如果我尝试通过
delete(2)
来删除,它可能会显示
NullPointerException
。代码如下:

    Node head;
    
    public void insert(int data)
    {
        Node node = new Node();
        node.data = data;
        node.next = null;
        node.prev = null;
        if(head == null)
        {
            head = node;
            return;
        }
        Node n = head;
        while(n.next!=null)
        {
            n = n.next;
        }
        node.prev = n;
        n.next = node;
    }
    
    public void show()
    {
        if(head == null)
        {
            System.out.println("Doubly Linked List is empty so please enter values first.");
            return;
        }
        Node n = head;
        while(n.next!=null)
        {
            System.out.println(n.data);
            n = n.next;
        }
        System.out.println(n.data);
    }


    public void delete(int index)
    {
        if(head == null)
        {
            System.out.println("List is empty.");
            return;
        }
        if(index == 0)
        {
            head = head.next;
            head.prev = null;
            return;
        }
        Node n = head;
        for(int i=0;i<index;i++)
        {
            n = n.next;
        }
        n.prev.next = n.next;
        n.next.prev = n.prev;
    }
}
节点头;
公共空白插入(整型数据)
{
节点=新节点();
node.data=数据;
node.next=null;
node.prev=null;
if(head==null)
{
头部=节点;
返回;
}
节点n=头部;
while(n.next!=null)
{
n=n.next;
}
node.prev=n;
n、 下一个=节点;
}
公开展览(
{
if(head==null)
{
System.out.println(“双链接列表为空,请先输入值”);
返回;
}
节点n=头部;
while(n.next!=null)
{
系统输出打印项次(n.数据);
n=n.next;
}
系统输出打印项次(n.数据);
}
公共无效删除(整型索引)
{
if(head==null)
{
System.out.println(“列表为空”);
返回;
}
如果(索引==0)
{
head=head.next;
head.prev=null;
返回;
}
节点n=头部;

对于(int i=0;i当我运行代码时,
NullPointerException
发生在此行:

n.next.prev=n.prev;
而不是你在问题中说的那句话

删除列表中最后一个
节点时会发生
NullPointerException
。这是因为列表中最后一个
节点的
next
值为null。因此
n.next
为null,因此
n.next.prev
抛出
NullPointerException

您需要检查
n.next
是否为空,并且只有当它不是空时,您才能执行代码:
n.next.prev=n.prev

另外,您需要在方法
delete()
中检查参数
index
的值。一种方法是跟踪列表中的元素数量

下面的代码包含了所描述的更改。我添加的部分前面有注释更改

公共类DbLnkLst{
私有静态类节点{
int数据;
节点下一步;
节点前置;
}
节点头;
公共空白插入(整型数据)
{
节点=新节点();
node.data=数据;
node.next=null;
node.prev=null;
if(head==null)
{
头部=节点;
返回;
}
节点n=头部;
while(n.next!=null)
{
n=n.next;
}
node.prev=n;
n、 下一个=节点;
}
公开展览(
{
if(head==null)
{
System.out.println(“双链接列表为空,请先输入值”);
返回;
}
节点n=头部;
while(n.next!=null)
{
系统输出打印项次(n.数据);
n=n.next;
}
系统输出打印项次(n.数据);
}
公共无效删除(整型索引)
{
//在这里换车。
如果(指数<0){
抛出新的IllegalArgumentException(“负索引:”+索引);
}
if(head==null)
{
System.out.println(“列表为空”);
返回;
}
如果(索引==0)
{
head=head.next;
head.prev=null;
返回;
}
节点n=头部;

对于(int i=0;i您不检查n.next是否为null。您是否尝试过使用调试器?列表有多长?请阅读。如果能够复制代码并运行它以查看缺少的信息,那就太好了。首先,如果能够看到异常的整个堆栈跟踪,那就太好了。如果您尝试删除最后一个元素,您将get
n==null
@jhamon我确实尝试过使用调试器。它在n.prev.next=n.next处显示错误。有时甚至最后一个元素删除也会起作用。具体来说,如果我的列表是:5,10,15,20,25。当我尝试删除'10'ie,索引'1'时,它会显示错误。对于其余元素,它工作正常。
List is:
0
1
2
After 'delete(2)', list is:
0
1
Try 'delete(2)' again.
Exception in thread "main" java.lang.IllegalArgumentException: invalid index: 2
    at genrlprj/misctsts.DbLnkLst.delete(DbLnkLst.java:73)
    at genrlprj/misctsts.DbLnkLst.main(DbLnkLst.java:100)