首页 > 解决方案 > 从双向链表中删除元素时出现空指针异常

问题描述

当我尝试删除某些索引的任何元素时,代码工作正常,但对于其他一些元素,它不起作用。例如,每当我尝试通过传递进行删除时,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;
    }
}

所以这是我的代码,你可以在那里看到删除方法。我什至通过调试模式运行,它显示错误n.prev.next = n.next 任何帮助都非常感谢。

标签: javadata-structuresnullpointerexception

解决方案


当我运行您的代码时,NullPointerException发生在这一行:

n.next.prev = n.prev;

而不是你在问题中所说的那一行。

NullPointerException您删除Node列表中的最后一个时发生。这是因为列表中next最后一个Node的值为空。所以n.next是 null ,因此n.next.prevthrows NullPointerException

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

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

下面的代码包含了所描述的更改。我添加的部分前面是评论Change here

public class DbLnkLst {
    private static class Node {
        int data;
        Node next;
        Node prev;
    }

    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)
    {
        // Change here.
        if (index < 0) {
            throw new IllegalArgumentException("negative index: " + 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++)
        {
            // Change here.
            if (n.next == null) {
                throw new IllegalArgumentException("invalid index: " + index);
            }

            n = n.next;
        }
        n.prev.next = n.next;

        // Change here.
        if (n.next != null) {
            n.next.prev = n.prev;
        }
    }

    /**
     * For testing the class.
     */
    public static void main(String[] args) {
        DbLnkLst list = new DbLnkLst();
        list.insert(0);
        list.insert(1);
        list.insert(2);
        System.out.println("List is:");
        list.show();
        list.delete(2);
        System.out.println("After 'delete(2)', list is:");
        list.show();
        System.out.println("Try 'delete(2)' again.");
        list.delete(2);
    }
}

运行上述代码的输出如下:

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)

推荐阅读