码迷,mamicode.com
首页 > 其他好文 > 详细

递归调用 LeetCodel例题分析

时间:2020-06-10 12:58:40      阅读:59      评论:0      收藏:0      [点我收藏+]

标签:回溯   自己   面试题   public   rev   eve   定义   理解   tno   

一看就会,一写就废?详解递归

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都需要从头结点开始找。

  • 递归函数必须要有终止条件,否则会出错;
  • 递归函数先不断调用自身,直到遇到终止条件后进行回溯,最终返回答案

技术图片

 

  1. 终止条件是当前节点或者下一个节点==null
  2. 在函数内部,改变节点的指向,也就是 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例题分析

标签:回溯   自己   面试题   public   rev   eve   定义   理解   tno   

原文地址:https://www.cnblogs.com/ScarecrowAnBird/p/13084291.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!