user2616744
user2616744

Reputation: 41

Can someone explain this Linked List Null Pointer Exception?

Node class

private class Node<E> {
    E data;
    Node<E> next;

    public Node(E obj) {
        data = obj;
        next = null;
    }
}

insert method (ascending order)

public void insert(E obj) {
    Node<E> newNode = new Node<E>(obj);
    Node<E> prev = null, curr = head;
    while(curr != null && ((Comparable<E>)obj).compareTo(curr.data) >= 0) {
        prev = curr;
        curr = curr.next;
    }
    if(prev == null) 
        head = newNode;
    else {
        prev.next = newNode;
        newNode.next = curr;
    }
    currentSize++;
}

remove method

public E remove() {
    if(isEmpty())
        return null;
    E tmp = head.data;
    head = head.next;
    currentSize--;
    return tmp;
}

I get Null Pointer Exception at the line

E tmp = head.data;

in the remove method

The error is fixed if the change the else statement in my insert method to

else
    prev.next = newNode;
newNode.next = curr;

Upvotes: 0

Views: 2535

Answers (1)

chiastic-security
chiastic-security

Reputation: 20520

There's a problem when you insert a new node that needs to go at the beginning of the list (because it's smaller than the current head node). When you get to this part:

if(prev == null) 
        head = newNode;

you're setting head to be the new node you've just created, but you also need to set newNode.next to be the previous head. So you really want

if(prev == null) {
        newNode.next = head;
        head = newNode;
}

which inserts the new node at the beginning but tacks the previous head onto it.

With your code as it stands, when you add a second element that should go at the beginning, you're accidentally discarding the element that's already there, but you're still increasing currentSize; so you end up with a list with only one element, but a currentSize of 2. When you then try to remove two elements, the second one fails with a NullPointerException because you try to read the data inside a non-existent element.

Upvotes: 1

Related Questions