【问题标题】:Trying to create a removeLastElement using recursion尝试使用递归创建 removeLastElement
【发布时间】:2012-03-14 05:01:31
【问题描述】:

我需要创建一个使用递归删除 LinkedList 的最后一个元素的方法。 这是我到目前为止所拥有的,但它似乎并没有删除节点......当我调用 list.size() 它仍然是相同的大小和相同的值。我在这里做错了什么? 顺便说一句,这是给 Java 的

public void removeLastElement(Node curr){
        if (curr == null)
            return;
        else{
            if(curr.next == null)
                curr = null;
            else
                removeLastElement(curr.next);
        }

    }

【问题讨论】:

  • 你给方法一个节点参数,所以这意味着你肯定知道它是最后一个元素,那么你为什么要使用一个方法,更有趣的是“递归”来删除最后一个元素,尽管你已经知道列表中的最后一个元素是什么?
  • 我认为你必须先遍历节点...类似于curr=curr.next 之前removeLastElement(curr.next); ..!!..然后将最后一条语句更改为:removeLastElement(curr);
  • 我的家庭作业要求我们使用递归。我想我们不应该使用节点参数吗?从您的回复来看。

标签: java recursion linked-list


【解决方案1】:

在 LinkedList 中要删除最后一个元素,您必须获取倒数第二个元素并设置

curr.next = null

【讨论】:

  • 我该怎么写?我是链表和递归的新手。对不起:(
  • @Ruuhkis 在姓名前添加“@”,以便人们可以在收件箱中收到评论:)
【解决方案2】:

您以正确的方式获取循环函数以删除最后一个节点。问题是你用curr.next == null 识别倒数第二个节点,如果你得到它,你就取消它,但那是你的实际输入!因此,您必须检查实际节点是否是列表中的 antepenultimate 节点:

if (curr.next.next == null) {
    curr.next = null; //Now you're modifying the data in your input.
}

有了这个变化,有更多的基本情况需要检查,但这取决于你,我的朋友。

【讨论】:

  • 倒数第二:我猜你的意思是倒数第三?
  • @mikek3332002 是的,这就是我的意思
【解决方案3】:
Boolean deleteLast(Node n)
{
    if(n.next == null)
       return true;

    if(deleteLast(n.next))
    {
        n.next = null;
        return false;
    }

    return false;
 }

【讨论】:

    【解决方案4】:
    Node deleteLast(Node n) {
      if (n.next == null)
        return null;
      n.next = deleteLast(n.next);
      return this;
    }
    

    一般的想法是你问下一个节点“嘿,你能告诉我你在哪里,然后删除你的最后一个节点吗?”最后一个节点可以只说“我不在”,一切都会到位。

    这与 Aadi 的答案非常相似,只是使用 Nodes 而不是 booleans。

    【讨论】:

      猜你喜欢
      • 2020-04-05
      • 2013-01-13
      • 1970-01-01
      • 2016-01-02
      • 2020-12-11
      • 1970-01-01
      • 1970-01-01
      • 2023-03-02
      • 1970-01-01
      相关资源
      最近更新 更多