递归算法主要寻找:
终止条件:递归的尽头。
单级递归的行为:在一次递归里要做的事情。
返回值:每次迭代要return的东西。
例题
求二叉树的深度
class Solution {
public int maxDepth(TreeNode root) {
//终止条件:当树为空时结束递归,并返回当前深度0
if(root == null){
return 0;
}
//root的左、右子树的最大深度
int leftDepth = maxDepth(root.left);
int rightDepth = maxDepth(root.right);
//返回的是左右子树的最大深度+1
return Math.max(leftDepth, rightDepth) + 1;
}
}
两两交换链表中的节点
例如
给定 1->2->3->4, 你应该返回 2->1->4->3.
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode swapPairs(ListNode head) {
if(head == null || head.next == null){
return head;
}
ListNode next = head.next;
head.next = swapPairs(next.next);
next.next = head;
//根据第二步:返回给上一级的是当前已经完成交换后,即处理好了的链表部分
return next;
}
}
反转链表
首先,假定方法是已经实现的。
终止条件为:当当前节点(传了空节点)或下一节点(传了单节点)为空,则无需反转返回当前节点。
递归行为:假定之后的节点均已实现反转,则需要将已经反转的尾部的next变为当前节点,而当前节点由于是第一个节点,其next为null。此处注意在反转前需要先留存反转后的尾部;
返回值:返回反转后的头结点。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
//终止条件
if(head==null||head.next==null){
return head;
}else{
//保留尾部以便于head节点使用
ListNode tmp = head.next;
//剩余节点反转后的头,其实也是最终的头
ListNode newHead = reverseList(head.next);
tmp.next = head;
head.next = null;
return newHead;
}
}
}

