java递归地反转链表,有人能带我遍历它吗?
public void reverse(Node curr) {
if (isEmpty()) {
return;
}
if (curr.next == null) {
head = curr;
return;
}
reverse(curr.next);
curr.next.next = curr;
curr.next = null;
}
我在学递归。。我的弱点,我只是不明白这是怎么回事。。。我看到它从第二个节点开始。。然后使下一个,下一个,它的链接为空。。。我就是不明白。很抱歉问你这个新问题。我想补充我所了解的。。但不幸的是,事情就是这样
# 1 楼答案
我将完全忽略您的示例代码,因为我也不理解它。在我看来,这不是思考这个问题的最简单方式。让我们一起从概念上思考这个问题:
last + reverse(listWithLastRemoved)
让我们试着列出两个。它里面有
[a, b]
。你把它传进来,然后执行第#3步。因此,它确实:忽略左手边一秒钟
reverse([a])
将返回[a]
,因为它与第#2步匹配。这可以评估为这可以评估为
请注意,这是伪代码。我用
+
来暗示在列表的前面添加一个元素让我们再试一次,但这次有3个元素,
[a b c]
:正如您所指出的,要获得最后一个元素,您必须“迭代”列表以找出最后一个元素。这听起来像是必须使用
for
循环(这不是递归的),但获取最后一个循环也可以递归完成。事实上,它的算法比reverse
更简单,从一开始就是一个更好的练习。我将解释getLast
的步骤:getLast
李>让我们用
[a b c]
试试:请注意,最后一步返回的是一个元素,而不是列表
# 2 楼答案
思考这个问题的一个方法是举一个小例子。首先,两种边缘情况:
curr
是一个单独的节点,那么它就是它自己的反转(同样地,很平常);因此,将当前列表头设置为curr
李>假设这两个都不成立,那么棘手的事情就是找出最后一块代码是如何工作的。大概整个过程都是通过调用
reverse(head)
启动的。让我们看看两元素列表会发生什么:由于每个递归调用都会创建一个新的
curr
,因此我用一个索引注释了curr
,以显示递归的应用级别。现在有一个呼叫reverse(curr.next)
。在该调用过程中,方法开头的图片如下所示:这满足了第二种边缘情况,因此该方法将图片更改为:
(请注意,尽管
curr
是一个单元素列表,但该元素不是head
。这就是为什么整个过程都有效的关键!)现在该方法返回,我们回到第一个调用。现在的图片如下所示:第二行代码(在第三个块中)是
curr.next.next = curr;
。这将图片更改为:最后,它设置
curr.next = null;
:稍微盯着它看一眼,就会让你相信,事实上,清单是相反的
同样的技术也可以用来观察这如何逆转更长的列表。最简单的方法是调用
reverse(curr.next)
将反转列表的尾部,接下来的两行将把curr
固定到列表的末尾