【问题标题】:Linked lists - Can't figure out why this remove last function is not working?链接列表 - 无法弄清楚为什么这个删除最后一个功能不起作用?
【发布时间】:2013-11-17 00:34:58
【问题描述】:

我做了这个删除最后一个函数,它看起来应该可以工作,但是当我调用它时,它实际上并没有删除任何东西,所有的节点都还在。

有什么问题吗?

  public Object removeLast()
    {
        Node currentNode;
        currentNode = this.getHead();
        while(currentNode != null)
        {

            if(currentNode.getNext()==null)
            {
               currentNode = null;
               return null;
            }
            currentNode = currentNode.getNext();
        }
        return null;
    }

【问题讨论】:

    标签: java function methods linked-list


    【解决方案1】:

    您有一个包含节点的列表。每个节点都包含一个指向下一个节点的指针。

    要从列表中删除一个节点,你必须将 previous 节点的 next 指针设置为 null

    如果你还有一个指向前一个元素的指针,这很简单。比如:

    public Object removeLast()
    {
        Node currentNode;
        currentNode = this.getHead();
        while(currentNode != null)
        {
    
            if(currentNode.getNext()==null)
            {
               // The line below is changed!!!
               currentNode.getPrevious().setNext(null);
               return null;
            }
            currentNode = currentNode.getNext();
        }
        return null;
    }
    

    如果你在每个节点中都有一个指向下一个和前一个节点的指针,那么我们称之为双向链表。


    另外,返回类型不必为Object,您可以将方法签名更改为:

    public void removeLast()
    

    然后将您的每个return null; 更改为return;

    【讨论】:

    • 我想你的意思是public void removeLast()。请注意,remove 方法返回它们删除的对象并不少见,所以我希望将第一个 return null; 更改为 return currentNode; 可能是所需要的(谁知道?) - 当然,这是假设您的修改在地点。
    • @fd。同意两点。我已经更正了我的签名建议。
    【解决方案2】:

    您现在所做的是将虚拟节点设置为null,但这根本不会影响您的列表。我会尝试形象化:

    您的原始列表由节点组成,由下一个指针连接。局部变量currentnode 引用列表中的节点之一。下面,它指向最后一个元素。

    head --<next>-> node --<next>-> node --<next>-> node --<next>-> null
                                                      ^
                                                      |
                                                currentnode
    

    如果您现在执行currentnode = null,则会产生:

    head --<next>-> node --<next>-> node --<next>-> node --<next>-> null
    
    
                                                currentnode --> null
    

    请注意,这根本不会影响您的链表。


    您想要做的是将最后一个节点的--&lt;next&gt;-&gt; 设置为null。为此,您应该在迭代列表时跟踪前一个节点:

    if (getHead().getNext() == null) {
        setHead(null);
    } else {
        Node previous = getHead();
        Node current = previous.getNext();
    
        while (current.getNext() != null) {
            previous = current;
            current = current.getNext();
        }
    
        previous.setNext(null);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-28
      • 1970-01-01
      • 1970-01-01
      • 2013-11-30
      • 1970-01-01
      相关资源
      最近更新 更多