【问题标题】:How to pop a Node on a stack without getting a NPE如何在不获取 NPE 的情况下将节点弹出堆栈
【发布时间】:2015-09-30 09:49:24
【问题描述】:

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

当“pops 数”等于“链表的大小”时,此方法将抛出 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;

 }

另一个问题:不确定,我应该调用变量head(链表概念)还是top(堆栈概念)?请也回答这个问题。

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

【问题讨论】:

  • 为什么你要从头开始做堆栈逻辑,为什么不使用 java one
  • 我必须自己实现才能更深入地学习数据结构。

标签: java data-structures linked-list stack


【解决方案1】:

在您的第一个实施中:

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;

 }

如果 head 不为 null,则直接返回,而不推进它。只要您使用return,该方法就不会执行任何其他操作。


注意:最好返回与push 相同的类型,而不是返回节点。返回Node 会使用户危险地访问您的链接列表。您应该返回实际元素。

【讨论】:

  • 好点!我现在更改了返回元素的方法,并确保将 head 存储为临时以返回临时!很好的帮助!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2012-04-23
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 2023-03-05
    • 2018-03-29
    • 1970-01-01
    相关资源
    最近更新 更多