删除第一个元素的双链表

时间:2016-04-21 14:06:24

标签: java doubly-linked-list

我对java很新,我的双向链表addFront方法和addRear方法工作正常,但只有dequeue方法不起作用。在main方法中,我使用dequeueFront ()方法进行测试以删除前元素,当我删除前面元素时,它可以工作,但是如果我继续删除前面元素,

Exception in thread "main" java.lang.NullPointerException
    at DoublyLinkedDeque.dequeueFront(DoublyLinkedDeque.java:97)

出来了,

Line97是frontNode.previous=null

我只是想知道如何正确地从双链表中删除前元素。

public E dequeueFront() throws NoSuchElementException 
{
    if(frontNode!=null)
    {
        E frontElement=frontNode.element;
        frontNode=frontNode.next;
        frontNode.previous=null;
        frontNode.next=null;
        numElement--;
        if(numElement==0)
            rearNode=null;
        return frontElement;
    }
    else
        throw new NoSuchElementException();
}

2 个答案:

答案 0 :(得分:0)

 frontNode=frontNode.next;

如果frontNode之后没有下一个,则frontNode.next返回null。

如果frontNode为null,则尝试执行:

 frontNode.previous=null;

将抛出空指针异常,因为如何从不存在的节点访问上一个节点?如果不考虑如何使其与您的实现一起工作,只需进行空检查就可以阻止这种情况发生。

if(frontNode != null){
    frontNode.previous = null;
}

您必须使用“.next”同时检查

或者,也许您可​​以检查numElements是否为1.我会让您考虑如何解决该问题。

答案 1 :(得分:0)

看起来应该更像

public E dequeueFront() throws NoSuchElementException {
if(frontNode!=null)
{
    E frontElement=frontNode.element;
    N oldFront = frontNode ;
    frontNode=oldFront.next; // frontNode may now be null
    if( frontNode != null ) frontNode.prev=null; // remove link to oldFront
    oldFront.previous=null; // should be unessary
    oldFront.next = null ;

    numElement--;
    if(numElement==0)
        rearNode=null;
    return frontElement;
}
else
    throw new NoSuchElementException();
}
相关问题