按字典顺序排列的链表返回空指针异常

时间:2012-03-10 14:46:33

标签: java linked-list

我正在尝试构建按字典顺序排列的链表。我在纸上计划了一切,并认为我需要一切正确,但是一旦我插入第二个或第三个条目,它返回一个空指针异常。

Exception in thread "main" java.lang.NullPointerException
at DoublyLL.insert(DoublyLL.java:88)

如果我输入,例如:

"chris", "andy", then "bob", "bob" returns the excpetion.
"chris", "bob", then "andy", "andy" returns the exception
"andy", "bob", I get the same exception with the addition of at DoublyLL$Node.access$000(DoublyLL.java:148)

代码:

public boolean insert(StudentListing newListing)
{  Node n = new Node();
    if(n == null) // out of memory
       return false;
    else
    {
                    Node q = new Node();
        q = h;
        int lex;
        if (q.next == null)     // first inputed node
        {
            n.next = q.next;
            q.next = n;
            n.back = q;
            n.l = newListing.deepCopy();
            return true;
        } else                  // not first node
        {
            q = q.next;
            do
            {
               // This is the line the error is called vvv
                lex = q.l.getKey().compareTo(newListing.getKey());
               // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                if (lex < 0)
                {
                    // keep going
                    q = q.next;
                } else if (lex > 0)
                {
                    // place before q
                    n.back = q.back;
                    q.back = n;
                    n.next = q;
                    n.back.next = n;
                    return true;
                } else if (lex == 0)
                {
                    // q and listing match
                }
            } while (lex < 0);
        }
    }
    return false;
}

Inner class

 public class Node
 {   private StudentListing l;
     private Node next;
     private Node back;
     public Node()
 { }
}

1 个答案:

答案 0 :(得分:1)

这里最大的问题是,当您将新的StudentListing插入非空列表时,您会遍历列表,直到找到大于StudentListing you'的元素为止重新插入。但是,如果您插入的StudentListing大于列表中的任何元素,那么您永远不会找到这样的元素,因此您将在列表的末尾运行。在编写q = q.next之前,您需要检查是否q.next == null,并正确处理该案例。

(代码中还有各种非Java非主义 - 例如,if(n == null) // out of memory将永远不会成为现实,因为Java通过引发异常而不是返回{表示内存不足错误{1}} - 但这些对我来说都不是一个主要问题。)