首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java中的递归链表

Java中的递归链表
EN

Stack Overflow用户
提问于 2012-01-27 20:55:56
回答 3查看 1.2K关注 0票数 5

我正在编写一个作业,让我编写一个java程序,用递归将链表中包含的数据反向打印出来。到目前为止,这是我所拥有的,它可以工作,但只在列表IE中的最后一个元素。一旦打印出最后一个元素,它就会停止。

代码语言:javascript
运行
复制
public String reverse(IntNode head){
        String result = "";
        if(head.getLink() == null){
            result += head.getData();
            return result;
        }

        else if(head.getLink().getLink() == null){
            result += head.getLink().getData();
            head.removeNodeAfter();
            return result;
        }

        else{
            return reverse(head.getLink());
        }
    }

我怎样才能让它一直在递归树上反向遍历列表呢?

EN

回答 3

Stack Overflow用户

发布于 2012-01-29 22:39:54

正如其他人指出的,您的解决方案比需要的要复杂得多。

首先,请注意,为了遍历列表,您不需要(也可能不想)从列表中删除任何项。

其次,与其检查当前节点的链接是否为null,还可以实际检查当前链接本身是否为null (只要不尝试取消引用,这没有什么问题)。这简化了逻辑。

代码语言:javascript
运行
复制
public String reverse(IntNode head) {
    if (head == null)
        return "";
    else
        return reverse(head.getLink()) + head.getData();
}

或者你甚至可以这样写:

代码语言:javascript
运行
复制
public String reverse(IntNode head) {
    return (head == null)? "" : reverse(head.getLink()) + head.getData();
}
票数 3
EN

Stack Overflow用户

发布于 2012-01-28 05:44:26

这段代码比需要的要复杂得多。在这种情况下,可以将递归分解为2种情况(或函数可能具有的2条执行路径):

  1. Recursive大小写:此路径调用自身,以便递归可以启动(或continue)
  2. Base大小写:此路径结束递归时不调用

)

您的代码有两个基本情况,它只需要1。考虑所有可以调用函数的输入:

  1. head is null
  2. headIntNodea. head.getLink()返回null

b. IntNode返回一个head.getLink()

代码语言:javascript
运行
复制
1. `head.getLink().getLink()` returns `null`
2. `head.getLink().getLink()` returns an `IntNode`

您将开始注意到一个模式;一旦将其简化,实际上只有两个可能的输入:

  1. head is null
  2. headIntNode

如果head是一个IntNode,则该函数可以用head.getLink() (递归大小写)调用自己,并且只能是相同的2个输入,这种情况一直持续到head变成null (大小写)为止。

为了回答您的实际问题,它只返回最后一个元素的值,因为在递归的情况下,您实际上并不是在当前IntNode的值(即head.getData())前面;您只是返回下一个reverse()调用的结果,这意味着它将递归到最后一个元素,然后只返回该元素的值。

票数 2
EN

Stack Overflow用户

发布于 2012-01-28 06:24:27

当考虑递归时,这是一个很好的策略,从地面建立,直到你遇到有趣的案例。在每个步骤中,尝试重用以前的案例。

Q1。空列表的反面是什么?

A1。一张空名单。[]

Q2。有一个元素的列表的反向是什么?

A2。同样的名单。1

Q3。有两个元素的列表的反向是什么?12

A3。第一个元素,附加到第二个元素。 2 1

Q4。有三个元素的列表的反面是什么?12,2,3

A4。第一个元素,追加到其余元素列表的反向。3 2+1=3 2 1

现在,模式应该变得清晰了:N元素列表的反向是最后一个N1元素的反向,并附加了第一个元素)。

我们的基本情况是什么?从上面可以看出,它有一个包含1或0元素的列表。但是,仔细看看,将我们的模式应用到长度为1的列表中,我们会发现,带有第一个元素的反转是[],即[] +1。所以,实际上,我们的基本情况只是空的列表。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9057999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档