繁体   English   中英

递归打印单个链表作业

[英]Recursive printing of a singly linked list homework

我在java类中有一个作业,需要以递归的方式反向打印出链表。 我在网上查看了很多递归方法的示例,这些示例执行此操作,但是将节点作为参数,据我的理解,我需要输入一个链表,因为我需要打印出整个列表。 下面是我编写的代码,在某种意义上说,它可以递归地打印列表,但它仍然与我创建列表的顺序相同。 在打印出列表之后,它也不会引发此类异常。 我的主要问题/问题是如何最好地递归打印。

public void printRecurse2(LinkedList<String> list2)
{
    if(list2 == null)
        return;
    System.out.println(list2.pop());
    printRecurse2(list2);

}

您需要检查该节点是否还有另一个下一个节点。 这样,您就可以延迟打印每个元素,直到到达列表的末尾:

void printReverse(Node node) {
    if(node.next != null) { // recurse until the last node is found
        printReverse(node.next);  // print the next node first
    }
    System.out.println(node.data); // print out the node(this is only reached after the last node is found
}

这将通过传递链接列表的第一个节点来打印整个列表。 然后,您无需将整个列表传递给每个呼叫。 您还可以通过更改传递给第一个调用的节点来使用它仅打印列表的一部分。

您的list永远不会为null ,这就是递归不会及时停止的原因。 您需要检查列表是否不为空,而不是为空,例如

if(list2.peek() == 0)
    return;
System.out.println(list2.pop());
printRecurse2(list2);

这避免了异常。 要反向打印,您需要从列表的另一端开始:

if(list2.peekLast() == null)
    return;
System.out.println(list2.pollLast());
printRecurse2(list2);

因为这是家庭作业,所以我仅会指导您,而不是给您答案。

在任何递归函数中,您至少需要一个基本案例才能结束递归。 您已选择if (list2 == null)作为基本情况。 在每个函数调用的最后,您要调用printRecurse2(list2) ,其中list2弹出了一个元素。 无论如何, list2将存在,并且不等于null 但是,它可能空的 考虑更改您的基本情况。

关于删除项目的顺序,请考虑Java API for pop() 弹出从列表中删除第一项。 因此,第一次调用printRecurse2() ,第一项将被弹出并打印。 下次,第二个项目现在将弹出并打印。 您可能需要研究另一个方法,例如removeLast()

如果需要反向获取元素,请尝试使用LinkedList API中的removeLast()方法,它将返回然后删除LinkedList中的最后一个元素:

public void printRecurse2(LinkedList<String> list)
{
    if(list.isEmpty()) //base
        return;
    System.out.println(list.removeLast()); //print the last element
    printRecurse2(list); //recurse
}

此外,由于此方法消耗了LinkedList您可能希望将LinkedList的副本传递给此方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM