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;
}
Run Code Online (Sandbox Code Playgroud)
我正在努力学习递归..我最薄弱的一点,我只是不明白它是如何工作的...我看到它从第二个节点开始......然后使下一个,在当前的旁边,它的链接为null ...我只是不明白.抱歉新问题.我会添加更多我理解的东西..但不幸的是,这真的是关于它...
我将完全忽略您的示例代码,因为我也不理解它.这不是思考IMO这个问题的最简单方法.让我们在概念上一起思考这个:
last + reverse(listWithLastRemoved)让我们用两个列表来试试这个.它有[a, b]它.你传入它并执行第3步.结果它确实:
b + reverse([a])
Run Code Online (Sandbox Code Playgroud)
忽略左手边一秒钟. reverse([a])将返回,[a]因为它匹配步骤#2.这可以评估为
b + [a]
Run Code Online (Sandbox Code Playgroud)
这可以评估为
[b, a]
Run Code Online (Sandbox Code Playgroud)
请注意,这是伪代码.我+用来暗示在列表的前面添加一个元素.
让我们再试一次,但这次有3个元素,[a b c]:
[a b c] #apply step #3
c + reverse([a b]) #apply step #3
c + b + reverse([a]) #apply step #2
c + b + [a] #add b to [a]
c + [b a] #add c to [b a]
[c b a]
Run Code Online (Sandbox Code Playgroud)
正如您所指出的,要获得最后一个元素,您必须"迭代"列表以找出最后的内容.听起来你必须使用一个for循环(这不会是递归的),但是也可以递归地完成最后一个循环.实际上,它的算法比起来更简单,reverse并且本来是一个更好的练习.我将解释以下步骤getLast:
getLast. 让我们尝试[a b c]:
[a b c] #apply step #3
getLast([b c]) #apply step #3
getLast([c]) #apply step #2
c
Run Code Online (Sandbox Code Playgroud)
请注意,最后一步返回一个元素,而不是一个列表.
| 归档时间: |
|
| 查看次数: |
224 次 |
| 最近记录: |