Java中的递归链表

时间:2012-01-27 20:55:56

标签: java

我正在编写一个赋值,让我编写一个java程序,以反向顺序打印使用递归的链表中包含的数据。到目前为止,这是我所拥有的,它的工作原理,但仅限于列表IE中的最后一个元素。一旦打印出最后一个元素,它就会停止。

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());
        }
    }

如何让它继续沿着递归树向后移动列表?

3 个答案:

答案 0 :(得分:3)

正如其他人所指出的,你的解决方案比它需要的更复杂。

首先,请注意您不需要(并且可能不会想要)从列表中删除任何项目以便遍历它。

其次,不是检查当前节点的链接是否为空,您实际上可以检查当前链接本身是否为空(只要您不尝试取消引用它,就没有错误)。这简化了逻辑。

public String reverse(IntNode head) {
    if (head == null)
        return "";
    else
        return reverse(head.getLink()) + head.getData();
}

或者你甚至可以这样写:

public String reverse(IntNode head) {
    return (head == null)? "" : reverse(head.getLink()) + head.getData();
}

答案 1 :(得分:2)

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

  1. 递归案例:此路径调用自身,以便递归可以开始(或继续)
  2. 基本情况:此路径通过返回而不自行调用
  3. 来结束递归

    您的代码有2个基本案例,它只需要1.想想您可以调用该函数的所有不同输入:

    1. headnull

    2. headIntNode

      一个。 head.getLink()返回null

      head.getLink()会返回IntNode

      1. head.getLink().getLink()返回null

      2. head.getLink().getLink()返回IntNode

    3. 你会开始注意到一种模式;一旦简化,实际上只有两种可能的输入:

      1. headnull
      2. headIntNode
      3. 如果headIntNode,则该函数可以使用head.getLink()(递归情况)调用自身,并且它可以只是那些相同的2个输入,并且这一直持续到{{1成为head(基本情况)。


        要回答你的实际问题,它只返回最后一个元素的值,因为在递归的情况下,你实际上并没有预先加上当前null的值(即IntNode);你只是返回下一个head.getData()调用的结果,这意味着它将递归直到它到达最后一个元素,然后返回 该元素的值。

答案 2 :(得分:2)

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

Q1。空列表的反转是什么? []

A1。一个空列表。 []


Q2。具有单个元素的列表的反转是什么? [1]

A2。同样的清单。 [1]


Q3。具有两个元素的列表的反转是什么? [1 2]

A3。第一个元素,附加到第二个元素。 [2 1](开始变得有趣)


Q4。具有三个元素的列表的反转是什么? [1 2 3]

A4。第一个元素,附加到剩余元素列表的反向。 [3 2] + [1] = [3 2 1]


现在模式应该开始明确:N个元素列表的反向与最后N-1个元素相反,并附加第一个元素。

我们的基本案例是什么?从上面可以看出,它具有1或0个元素的列表。仔细观察,将我们的模式应用于长度为1的列表,我们看到[1]反转是[],附加了第一个元素,即[] + [1]。实际上,我们的基本案例就是空列表。