Aman
Aman

Reputation: 158

Delete specific element from LinkedList....?

I am trying to delete an specific element from the linkedlist, however i am getting null pointer exception. Could any one pls fix my below mentioned code...

public void deleteElement(T num)
    {
        Node<T> ele = new Node<T>(num);
        if(head == null){
            System.out.println("Underflow");
            return;
        }
        Node<T> temp = head;
        while(temp != null)
        {
            if(temp.data == num){
                temp.previous.next = temp.next;
                return;
            }
            else
                temp = temp.next;
        }
        size--;
    }

Upvotes: 1

Views: 136

Answers (2)

Kaidul
Kaidul

Reputation: 15895

You should modify inside your while loop like this:

while(temp != null)
{
    if(temp.data == num) {
        if(temp.previous != null) {
            temp.previous.next = temp.next;
        }
        // you have to link-up the next's previous with temp's previous too 
        if(temp.next != null) {
            temp.next.previous = temp.previous;
        }
        temp = null; // to deference the node and let garbage collector to delete/clear this node
        break; // don't return here otherwise size-- won't execute
    }
    temp = temp.next;
}

Before referencing temp.next and temp.previous as lvalue you should check whether they are null otherwise it will throw NullPointerException.

Hope it helps!

Upvotes: 5

Jay Smith
Jay Smith

Reputation: 2490

You have to find Node object whose data is equal to T num. Use such loop:

for (Node<T> x = first; x != null; x = x.next) {
                if (num.equals(x.data)) {
                    unlink(x);
                    return true;
                }
            }

Where first is pointer to first node. In method remove you have to unlink found Node x from linked list:

T remove(Node<T> x) {
        // assert x != null;
        final T element = x.data;
        final Node<T> next = x.next;
        final Node<T> prev = x.prev;

        if (prev == null) {
            //if x is first node(head)
            first = next;
        } else {
            // link x.next to x.prev.next
            prev.next = next;
            //unlink x
            x.prev = null;
        }

        if (next == null) {
           //if x is last node(tail)
            last = prev;
        } else {
            // link x.prev to x.next.prev
            next.prev = prev;
            //unlink x
            x.next = null;
        }
// reset data
        x.data = null;
        size--;
        return element;
    }

Upvotes: 0

Related Questions