递归调用 LeetCodel例题分析
Posted 落叶归根
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归调用 LeetCodel例题分析相关的知识,希望对你有一定的参考价值。
一看就会,一写就废?详解递归
1. 前言
递归解法总是给人一种“只可意会不可言传”的感觉,代码一看就懂,自己动手一写就呆住了,很难受。究其原因,一是我们练习不够,二是理解不够。
2. 什么是递归?
递归的例子在平时生活中很容易见到,比如:
f(x) = f(x-1)+x;
如果x=3;带入上面的数学公式
f(3) = f(2)+3; f(3) = f(1)+2+3; f(3) = f(0)+1+2+3; 因为f(0)=1; f(3) = 1+1+2+3;
如果写成java的话
public int fx(int x){ if(x==0){ return 1; }else{ x = x + reverse(x-1); } return x; }
- 递归函数必须要有终止条件,否则会出错;
- 递归函数先不断调用自身,直到遇到终止条件后进行回溯,最终返回答案。
请看 面试题24. 反转链表 看看自己会了吗
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
1. 首先找到递归的出口
就是找到链表最后一个节点(尾结点),我们要反转当前的链表,就必须从尾结点开始,因为链表的性质就是:通过头结点来找到后面的节点进行操作,CRUD都需要从头结点开始找。
- 递归函数必须要有终止条件,否则会出错;
- 递归函数先不断调用自身,直到遇到终止条件后进行回溯,最终返回答案
- 终止条件是当前节点或者下一个节点==null
- 在函数内部,改变节点的指向,也就是 head 的下一个节点指向 head 递归函数那句
head.next.next = head
很不好理解,其实就是 head 的下一个节点指向head。
递归函数中每次返回的 cur 其实只最后一个节点,在递归函数内部,改变的是当前节点的指向。
完整的代码
/** * 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; ListNode cur = reverseList(head.next); head.next.next=head; head.next=null; return cur; } }
以上是关于递归调用 LeetCodel例题分析的主要内容,如果未能解决你的问题,请参考以下文章