2015-07-11 135 views
1

这是用于堆栈的链表实现的弹出方法。如何在没有获得NPE的情况下在堆栈上弹出节点

当“弹出数量”等于“链接列表的大小”时,此方法将抛出NPE。

例子:

LinkedList list = new LinkedList(); 
     list.push("A"); 
     list.push("B"); 
     list.push("C"); 

     System.out.println(list.pop().getElement()); 
     System.out.println(list.pop().getElement()); 
     // the below code list.pop will have a null value. 
     System.out.println(list.pop().getElement()); 
     System.out.println(list.pop().getElement()); 

public boolean isEmpty() 
{ 
     return head == null; 
} 

public Node pop() 
{ 

       if(!isEmpty()) 
       { 
        head = head.getNext(); 
        size--; 
       } 
       else if(isEmpty()) 
       { 
        System.out.println("empty stack"); 

       } 

       return head; 

} 

我的解决办法是重新编写这样的,但现在有被复制的返回头,我也没办法解决的代码。任何关于这个问题的指导都会有所帮助

public Node pop() 
{ 

       if(head != null) 
       { 
        return head; 
       } 
       if(!isEmpty()) 
       { 
        head = head.getNext(); 
        size--; 
       } 
       else if(isEmpty()) 
       { 
        System.out.println("empty stack"); 

       } 

       return head; 

} 

另一个问题:不知道,我应该叫可变头(链接列表的概念)或顶部(堆栈的概念)?请回答这个问题。

对于那些可能想知道为什么我返回一个节点对象的问题,我将会在稍后删除一个节点对象:我的教科书上说弹出意味着我需要返回弹出的节点以及将它从链接列表中移除,而不仅仅是删除它。

+0

为什么你要从头开始做堆栈逻辑,为什么不用java一个 –

+0

我必须实现自己的功能才能更深入地学习数据结构。 – Nicholas

回答

0

在你第一次执行:

public Node pop() 
{ 
    if(!isEmpty()) 
    { 
     head = head.getNext(); 
     size--; 
    } 
    else if(isEmpty()) 
    { 
     System.out.println("empty stack"); 

    } 

    return head; 

} 

想象一下你的列表是5->6->7->null

头指向5。该列表不是空的。所以你做的head = head.getNext(),现在头指向6.然后你返回head,这是6

所以你的错误是你跳过第一个元素而没有返回它。你应该做的是保持对当前头部的参考,提前头部,然后返回你保存的参考 - 而不是新的head


在你的第二个实现:

​​

如果头部不为空,你可以返回,没有推进它。只要您使用return,该方法就没有其他任何事情要做。


注:这将是更好,而不是返回节点,返回相同的类型,你push。返回Node会给用户危险的访问链表。您应该返回实际的元素。

+0

好点!我改变了我的方法返回到元素现在,我确保将头部存储为临时返回temp!很好的帮助! – Nicholas

0

在方法pop,你没有返回head,你正在返回head.getNext()

所以改变你的逻辑。你可以试试这个:

在方法pop

Node tem = head; 
if(!isEmpty()) 
    { 
     head = head.getNext(); 
     size--; 
    } 
    else // no need to check head again 
    { 
     System.out.println("empty stack"); 

    } 

    return tem; 
相关问题