如何在不获得NPE的情况下在堆栈上弹出节点



这是一个用于栈的链表实现的pop方法。

当"pop的个数"等于"链表的大小"时,该方法将抛出一个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;
 }

另一个问题:不确定,我应该调用变量头(一个链表的概念)或顶部(一个堆栈的概念)?也请回答这个问题。

对于那些可能想知道为什么我要返回一个稍后将被删除的节点对象的人,我的论点是:我的教科书说pop意味着我需要返回弹出的节点并将其从链表中删除,而不仅仅是删除它

第一次实现时:

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


在你的第二个实现中:

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

如果头不为空,只返回,不前进。一旦你使用了return,在这个方法中就不会做任何其他的事情了。


注意:最好不是返回一个节点,而是返回与push相同的类型。返回Node会给用户带来对链表的危险访问。您应该返回实际的元素。

在方法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;

相关内容

  • 没有找到相关文章

最新更新