2016-04-21 52 views
0

我对java很陌生,我的双向链表addFront方法和addRear方法工作正常,但只有出列方法不起作用。在主要的方法,我做一个测试使用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(); 
} 

回答

0
frontNode=frontNode.next; 

如果frontNode之后没有未来,那么frontNode.next返回null。

如果frontNode为null,则试图做的:因为你怎么从一个不存在的节点访问前一个节点

frontNode.previous=null; 

会抛出一个空指针异常?在不考虑如何使它与你的实现一起工作的情况下,只要做一个空检查就可以避免这种情况发生。

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

你将不得不做这种检查的“接下来”也

或者,也许你可以检查是否包含numElements = 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(); 
}