[Leetcode][第206题][JAVA][反转一个单链表][递归][迭代]

【问题描述】[简单]

在这里插入图片描述

【解答思路】

1. 递归 自底向上
  • 基本条件/终止条件:当前节点或者下一个节点==null

  • 递推关系: head.next.next = head

在函数内部,改变节点的指向,也就是 head 的下一个节点指向 head 递归函数那句
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

时间复杂度:O(N) 空间复杂度:O(N)
在这里插入图片描述

class Solution {public ListNode reverseList(ListNode head) {//递归终止条件是当前为空,或者下一个节点为空if(head==null || head.next==null) {return head;}//这里的cur就是最后一个节点ListNode cur = reverseList(head.next);//这里请配合动画演示理解//如果链表是 1->2->3->4->5,那么此时的cur就是5//而head是4,head的下一个是5,下下一个是空//所以head.next.next 就是5->4head.next.next = head;//防止链表循环,需要将head.next设置为空head.next = null;//每层递归函数都返回cur,也就是最后一个节点return cur;}
}
2. 递归 自顶向下
  • 寻找递推关系
  • 创建新函数,将「自底向上-范式」中的最终结果计算依赖的中间变量提取为函数的参数 -> prev为中间变量
  • 寻找递归基本情况,跳出时返回基本情况的结果与中间变量的计算结果(最终结果) -> 遍历完毕后,返回头节点pre
  • 根据函数参数与中间变量重新计算出新的中间变量 -> ListNode next = node.next;
  • 修改参数 -> node.next = prev;(调转方向 第一个指向了null)
  • 递归调用并返回(该处的返回由基本情况条件触发)-> reverse(node, next);

在这里插入图片描述

时间复杂度:O(N) 空间复杂度:O(N)

 public ListNode reverseList(ListNode head) {return reverse(null, head);}public ListNode reverse(ListNode prev, ListNode node) {if (node == null) {return prev;}// logicListNode next = node.next; //  node=1 next=2node.next = prev; // 1->null、2->1return reverse(node, next); // 1 2}
class Solution {ListNode pre = null, tmp = null;public ListNode reverseList(ListNode head) {if (head == null)return pre;tmp = head.next;head.next = pre;pre = head;head = tmp;return reverseList(head);}
}
3. 双指针 循环结构
  • 第一个指针叫 pre,最初是指向 null 的。
  • 第二个指针 cur 指向 head,然后不断遍历 cur。
  • 每次迭代到 cur,都将 cur 的 next 指向 pre,然后 pre 和 cur 前进一位。
  • 迭代完了(cur 变成 null 了),pre 就是最后一个节点了。

在这里插入图片描述

时间复杂度:O(N) 空间复杂度:O(1)
在这里插入图片描述

class Solution {public ListNode reverseList(ListNode head) {//申请节点,pre和 cur,pre指向nullListNode pre = null;ListNode cur = head;ListNode tmp = null;while(cur!=null) {//记录当前节点的下一个节点tmp = cur.next;//然后将当前节点指向precur.next = pre;//pre和cur节点都前进一位pre = cur;cur = tmp;}return pre;}
}

【总结】

1. 「自顶向下、自底向上、循环结构」三种方法完成
2.递归

在实现递归函数之前,有两件重要的事情需要弄清楚:

递推关系:一个问题的结果与其子问题的结果之间的关系。
基本情况:不需要进一步的递归调用就可以直接计算答案的情况。可理解为递归跳出条件。
一旦我们计算出以上两个元素,再想要实现一个递归函数,就只需要根据递推关系调用函数本身,直到其抵达基本情况。

3.递归模板套路

由下到上
在这里插入图片描述

参考链接:https://leetcode-cn.com/problems/reverse-linked-list/solution/dong-hua-yan-shi-206-fan-zhuan-lian-biao-by-user74/
递归学习链接:https://blog.csdn.net/dadongwudi/article/details/107649161

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/425064.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3.项目的基本概念

项目的基本概念 项目及其特征

python之各种装饰器的使用

"""    装饰器,带参数的装饰器,类的装饰器    判断是否为可迭代的    from collections import Iterable    print(isinstance([1,2,3],Iterable))    """    # 1、简单的装饰器    def debu…

[剑指offer]面试题第[1]题[JAVA][二维数组中的查找][数组][二分]

【问题描述】 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含…

[CodeForces-1138B] *Circus 解方程|数学

题意:有两场表演,n个艺术家,根据规则找出我们要挑选的人的编号,输出编号。 规则1 保证每个人只能参加一场表演,也就是同一个艺术家不能出现在两场表演中 规则2 两场表演参演的艺术家的数量是相同的 规则3 第一场可以…

概率论与数理统计

记录概率论与数理统计的笔记。课程是中国大学MOOC 浙江大学的《概率论与数理统计》课程。 本系列所有内容来源于:概率论与数理统计的学习内容来源于中国大学MOOC,以及参考书籍《概率论与数理统计》第四版,浙江大学。 必然的、确定性的事件…

[Leetcode][程序员面试金典][面试题08.03][JAVA][魔术索引][递归][优化]

【问题描述】[简单] 【解答思路】 1. 逐个查找 时间复杂度&#xff1a;O(N) 空间复杂度&#xff1a;O(1) public int findMagicIndex(int[] nums) {for (int i 0, length nums.length; i < length; i) {if (i nums[i])return i;}return -1;}2. 逐个查找优化 有序升序…

5如何让进行项目管理

项目管理分为五个过程组

python练习题-day25

class Person:  __key123def __init__(self,username,password):self.usernameusernameself.__passwordpassworddef __get_pwd(self):return self.__passworddef login(self):self.__get_pwd() alexPerson("alex","alex3714") print(alex._Person__passw…

第一章 概率论的基本概念

概率论与数理统计的学习内容来源于中国大学MOOC&#xff0c;以及参考书籍《概率论与数理统计》第四版&#xff0c;浙江大学。 随机现象  在一定条件下&#xff0c;有可能出现多种结果&#xff1b;而且在事情发生前不能知道结果。 随机试验  概念&#xff1a;对随机现象的…

【知识导图】数据结构与算法

[基础知识点] 10 个数据结构&#xff1a;数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树&#xff1b; 10 个算法&#xff1a;递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法 [学习技巧] 学习它的“来历”“…

CF 1174 D. Ehab and the Expected XOR Problem 异或技巧

题意就是给我们两个数n,x。让我们构造个数组&#xff0c;数组有三个条件 1.要有尽可能多的元素 2.要其中任何一段数字的异或和不等于0和x 3.元素的范围是[ 1, 2n2^n2n&#xff09; 分析&#xff1a;如果对异或足够敏感的话 应该能想到其中第二个条件的意思&#xff0c;其实…

第三十七期:刷脸支付叫好不叫座,为啥消费者和商家都不愿用先进科技?

移动支付相信大多数人都不陌生&#xff0c;中国移动支付的普及被人称为“新四大发明”&#xff0c;在中国移动支付产品发展如火如荼的今天&#xff0c;刷脸支付成为了新的时尚&#xff0c;然而这个时尚的支付方式却显得叫好不叫座&#xff0c;刷脸支付的问题到底出在哪了? 移动…

Hadoop 配置文件 启动方式

配置文件&#xff1a; 默认的配置文件&#xff1a;相对应的jar 中 core-default.xml hdfs-default.xml yarn-default.xml mapred-default.xml 自定义配置文件$HADOOP_HOME/etc/hadoop/ core.site.xml hdfs-site.xml yarn-site.xml mapredu-site.xml 启动方式&#xff1a; 各个服…

第二章 随机变量

随机变量  目标&#xff1a;将实验结果数量化。实验结构有数字型和非数字型。数字型&#xff1a;降雨量、上车人数等。非数字型&#xff1a;晴天/阴天/下雨、化验结果阴性/阳性等。  定义&#xff1a;随机试验样本空间S&#xff0c;如果XX(e)为定义在S上的实数单值函数&…

[Leetcode][第632题][JAVA][最小区间][堆][滑动窗口]

【问题描述】[困难] 【解答思路】 1. 堆 复杂度 class Solution {public int[] smallestRange(List<List<Integer>> nums) {//区间的左边和右边int rangeLeft 0, rangeRight Integer.MAX_VALUE;//最小范围int minRange rangeRight - rangeLeft;//区间的左边最…

第十期:过去50年间,十大热门语言及发明者大盘点

本文收集了十大热门编程语言背后的程序员和设计者的名字和大家分享。以下是十大热门编程语言及其创建者&#xff0c;排名不分先后。 软件领域有许多编程语言&#xff0c;每年还涌现出越来越的新语言。新发布的语言有Scala、Kotlin、Go和Closure&#xff0c;但历史证明&#xff…

2018-2019-2 20165212《网络攻防技术》Exp5 MSF基础应用

2018-2019-2 20165212《网络攻防技术》Exp5 MSF基础应用 攻击成果 主动攻击的实践 ms17010eternalblue payload windows/x64/meterpreter/reverse_tcp&#xff08;成功&#xff09;payload generic/shellreversetcp&#xff08;成功&#xff09;ms17010psexec&#xff08;成功且…

【数据结构与算法】复杂度分析

一、什么是复杂度分析&#xff1f; 1.数据结构和算法解决是“如何让计算机更快时间、更省空间的解决问题”。 2.因此需从执行时间和占用空间两个维度来评估数据结构和算法的性能。 3.分别用时间复杂度和空间复杂度两个概念来描述性能问题&#xff0c;二者统称为复杂度。 4.复杂…