递归解题思路
1.一个问题可划分为若干类似的子问题 ,并且这些子问题都可以用同样的方法模板来解决,这个时候可以用递归。
2.能用递归的解法,也能用循环来解。具体适用哪种,看问题规模。
比较 | 优点 | 缺点 |
---|---|---|
递归算法 | 代码简洁、清晰,并且容易验证正确性。 | 它的运行需要较多次数的函数调用,如果调用层数比较深,每次都要创建新的变量,需要增加额外的堆栈处理,会对执行效率有一定影响,占用过多的内存资源。 |
循环算法 | 速度快,结构简单。 | 并不能解决所有的问题。有的问题适合使用递归而不是循环。如果使用循环并不困难的话,最好使用循环。 |
递归解题思路:
- 递归的终止条件:递归应该在何时结束?
- 返回值:上一次调用,返回的是什么?
- 单次调用要做什么:当前调用,应该完成什么任务?
LeetCode 24. 两两交换链表中的节点
class Solution {
public ListNode swapPairs(ListNode head) {
//1.终止条件
if (head == null || head.next == null) {
return head;
}
ListNode newHead = head.next;
//递归调用
head.next = swapPairs(newHead.next);
//3.当前调用做交换节点操作
newHead.next = head;
//2.返回新的以newhead为头结点的链表
return newHead;
}
}