Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的递归链表_Java - Fatal编程技术网

Java中的递归链表

Java中的递归链表,java,Java,我正在做一个作业,让我编写一个java程序,使用递归以相反顺序打印链表中包含的数据。到目前为止,这就是我所拥有的,它只对列表中的最后一个元素起作用,也就是说,一旦它打印出最后一个元素,它就会停止 public String reverse(IntNode head){ String result = ""; if(head.getLink() == null){ result += head.getData(); r

我正在做一个作业,让我编写一个java程序,使用递归以相反顺序打印链表中包含的数据。到目前为止,这就是我所拥有的,它只对列表中的最后一个元素起作用,也就是说,一旦它打印出最后一个元素,它就会停止

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

我怎样才能让它在递归树上继续向后遍历列表?

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

  • 递归案例:此路径调用自身,以便可以启动(或继续)递归
  • 基本情况:此路径通过返回而不调用自身来结束递归
  • 您的代码有2个基本情况,只需要1个。考虑所有可以调用函数的不同输入:

  • head
    null

  • head
    是一个
    IntNode

    a
    head.getLink()
    返回
    null

    b
    head.getLink()
    返回一个
    IntNode

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

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

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

  • head
    null
  • head
    是一个
    IntNode
  • 如果
    head
    是一个
    IntNode
    ,则该函数可以使用
    head.getLink()
    (递归情况)调用自身,并且它只能是相同的两个输入,直到
    head
    变为
    null
    (基本情况)



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

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

    问题1。空列表的反面是什么?[]

    A1。空名单。[]


    问题2。一个元素列表的反面是什么?[1]

    A2。同样的清单。[1]


    第三季度。有两个元素的列表的反面是什么?[12]

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


    第四季度。有三个元素的列表的反面是什么?[1 2 3]

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


    现在模式应该开始变得清晰了:N个元素列表的反面是最后N-1个元素的反面,并附加了第一个元素)


    我们的基本情况是什么?从上面看,它似乎有一个1或0个元素的列表。但仔细观察,将我们的模式应用于长度为1的列表,我们会发现[1]反转为[],并附加了第一个元素,即[]+[1]。所以实际上,我们的基本情况只是一个空列表。

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

    首先,请注意,您不需要(也可能不希望)从列表中删除任何项来遍历它

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

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

    我会避免给他实际的代码,因为他暗示这是一个家庭作业。有人真的因为这太有用而否决了吗?这似乎是一个更极端的立场,而不是在元上的答案概述。