Java中的递归链表
我正在做一个作业,让我编写一个java程序,使用递归以相反顺序打印链表中包含的数据。到目前为止,这就是我所拥有的,它只对列表中的最后一个元素起作用,也就是说,一旦它打印出最后一个元素,它就会停止Java中的递归链表,java,Java,我正在做一个作业,让我编写一个java程序,使用递归以相反顺序打印链表中包含的数据。到目前为止,这就是我所拥有的,它只对列表中的最后一个元素起作用,也就是说,一旦它打印出最后一个元素,它就会停止 public String reverse(IntNode head){ String result = ""; if(head.getLink() == null){ result += head.getData(); r
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());
}
}
我怎样才能让它在递归树上继续向后遍历列表?这段代码比它需要的要复杂得多。在这种情况下,递归可分为两种情况(或函数可能具有的两条执行路径):
head
为null
head
是一个IntNode
:
ahead.getLink()
返回null
bhead.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();
}
我会避免给他实际的代码,因为他暗示这是一个家庭作业。有人真的因为这太有用而否决了吗?这似乎是一个更极端的立场,而不是在元上的答案概述。