算法通关村-----一图理解递归

递归的本质

递归的本质是方法调用,自己调用自己,系统为我们维护了不同调用之间的保存和返回功能。

递归的特征

执行范围不断缩小,这样才能触底反弹

终止判断在递归调用之前

如何写递归

以n的阶乘为例

第一步 从小到大递推

n=1 f(1)=1

n=2 f(2) = 2*f(1)=2

n=3 f(3) = 3*f(3)=6

f(n) = n*f(n-1)

第二步 分情况讨论 明确结束条件

当n=1时,f(n)=1

第三步 组合出完整方法

public int f(n){
	if(n==1){
		return 1;
	}
	return n*f(n-1);
}

如何看懂递归代码

一图理解递归

算法通关村-----一图理解递归_第1张图片

链表反转

问题描述

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。详见leetcode206

问题分析

之前我们已经使用过两种方式来进行链表反转。分别是虚拟头节点的方式和直接反转的方式,链表反转也可以通过递归来实现

代码实现

直接反转

public static LinkedNode reverse2(LinkedNode head){
    LinkedNode pre = null;
    LinkedNode current = head;
    while (current!=null){
        LinkedNode next = current.next;
        current.next = pre;
        pre = current;
        current = next;
    }
    return pre;
}

使用虚拟头节点进行反转

public LinkedNode reverse(LinkedNode head){
    LinkedNode vhead = new LinkedNode(-1);
    vhead.next = head;
    LinkedNode current = head;
    while(current!=null){
        LinkedNode next = current.next;
        current.next = vhead.next;
        vhead.next = current;
        current = next;
    }
    return vhead.next;
}

使用递归进行反转

public ListNode reverse(ListNode head) {
    if(head==null||head.next==null){
        return head;
    }
    ListNode node = reverseList(head.next);
    head.next.next = head;
    head.next = null;
    return node;
}

你可能感兴趣的:(算法,数据结构,链表)