我在我的java类中有一个赋值,我需要递归地反向打印出一个链表。我已经在网上找到了很多递归方法的例子来做这个,但是把一个节点作为一个参数,据我所知,我需要接受一个链表,因为我需要打印出整个列表。下面是我编写的代码,它的工作原理是它以递归方式打印出列表,但它仍然与我创建列表的顺序相同。在打印出列表之后,它也会抛出一个没有这样的元素异常。我的主要问题/问题是围绕如何最好地递归打印这个问题。
public void printRecurse2(LinkedList<String> list2)
{
if(list2 == null)
return;
System.out.println(list2.pop());
printRecurse2(list2);
}
答案 0 :(得分:1)
您需要检查节点是否有另一个下一个节点。这样,您可以推迟打印每个元素,直到到达列表末尾:
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
}
这将通过传入链表的第一个节点来打印整个列表。然后你不需要将整个列表传递给每个调用。您还可以通过更改传递给第一个调用的节点来使用它来打印列表的一部分。
答案 1 :(得分:0)
您的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);
答案 2 :(得分:0)
由于这是家庭作业,我只会指导你,而不是给你答案。
在任何递归函数中,至少需要一个基本案例来结束递归。您已选择(list2 == null)
作为基本案例。在每个函数调用结束时,您调用printRecurse2(list2)
,其中list2
已从中弹出一个元素。无论如何,list2
将存在,并且不等于null
。但可能 为空。考虑改变你的基本情况。
关于删除项目的顺序,请考虑pop()的Java API。 Pop从列表中删除第一个项。因此,当您第一次拨打printRecurse2()
时,会弹出并打印第一个项目。下一次,现在将弹出并打印第二个项目。您可能希望查看另一种方法,例如removeLast()。
答案 3 :(得分:0)
如果您需要反向获取元素,请尝试使用removeLast()
API中的LinkedList
方法,它将返回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
的副本传递给此方法。