我正在编写一个赋值,让我编写一个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());
}
}
如何让它继续沿着递归树向后移动列表?
答案 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个执行路径):
您的代码有2个基本案例,它只需要1.想想您可以调用该函数的所有不同输入:
head
是null
head
是IntNode
:
一个。 head.getLink()
返回null
湾head.getLink()
会返回IntNode
:
head.getLink().getLink()
返回null
head.getLink().getLink()
返回IntNode
你会开始注意到一种模式;一旦简化,实际上只有两种可能的输入:
head
是null
head
是IntNode
如果head
是IntNode
,则该函数可以使用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]。实际上,我们的基本案例就是空列表。