《算法题讲解指南:递归,搜索与回溯算法--递归》--3.反转链表,4.两两交换链表中的节点,5.快速幂

《算法题讲解指南:递归,搜索与回溯算法--递归》--3.反转链表,4.两两交换链表中的节点,5.快速幂

🔥小叶-duck个人主页

❄️个人专栏《Data-Structure-Learning》

《C++入门到进阶&自我学习过程记录》

《算法题讲解指南》--优选算法

《算法题讲解指南》--递归、搜索与回溯算法

未择之路,不须回头
已择之路,纵是荆棘遍野,亦作花海遨游


目录

3.反转链表

题目链接:

题目描述:

题目示例:

解法(递归):

算法思路:

C++算法代码:

算法总结及流程解析:

4.两两交换链表中的节点

题目链接:

题目描述:

题目示例:

解法(递归):

算法思路:

C++算法代码:

算法总结及流程解析:

5.快速幂

题目链接:

题目描述:

题目示例:

解法(递归-快速幂):

算法思路:

C++算法代码:

算法总结及流程解析:

结束语


3.反转链表

题目链接:

206. 反转链表 - 力扣(LeetCode)

题目描述:

题目示例:

解法(递归):

算法思路:

      1.递归函数的含义交给你一个链表的头指针,你帮我逆序之后,返回逆序后的头结点
      2.函数体:先把当前结点之后的链表逆序,逆序完之后,把当前结点添加到逆序后的链表后面即可
      3.递归出口:当前结点为空或者当前只有一个结点的时候不用逆序,直接返回
      注意注意注意:链表的题一定要画图,搞清楚指针的操作

C++算法代码:

/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: ListNode* reverseList(ListNode* head) { //递归的结束条件:当递归到头节点为空结点或者只要一个结点则返回 if(head == nullptr || head->next == nullptr) { return head; } ListNode* newhead = reverseList(head->next); head->next->next = head; //head->next相当于是反转后的尾结点 head->next = nullptr; return newhead; } };

算法总结及流程解析:

4.两两交换链表中的节点

题目链接:

24. 两两交换链表中的节点 - 力扣(LeetCode)

题目描述:

题目示例:

解法(递归):

算法思路:

      1.递归函数的含义:交给你一个链表,将这个链表两两交换一下,然后返回交换后的头结点;
      2.函数体:先去处理一下第二个结点往后的链表,然后再把当前的两个结点交换一下连接上后面处理后的链表;
      3.递归出口当前结点为空或者当前只有一个结点的时候,不用交换,直接返回
      注意注意注意:链表的题一定要画图,搞清楚指针的操作!

这道题其实在我们的优选算法中已经讲解过了,只是当时是利用其链表的性质使用循环、迭代(模拟算法)来解决的,感兴趣的可以去看看。

《算法题讲解指南:优选算法-链表》--51.两数相加,52.两两交换链表中的节点-ZEEKLOG博客

但是我相信如果真的理解了用宏观的视角来看待递归,一定会觉得递归比上面的模拟实现简单太多了。

C++算法代码:

/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { public: ListNode* swapPairs(ListNode* head) { //解法:递归算法(宏观视角看待递归) //递归结束条件:当此时子问题中的链表节点只有一个或者没有为空 if(head == nullptr || head->next == nullptr) { return head; } ListNode* tmp = swapPairs(head->next->next); ListNode* newhead = head->next; newhead->next = head; head->next = tmp; return newhead; } };

算法总结及流程解析:

5.快速幂

题目链接:

50. Pow(x, n) - 力扣(LeetCode)

题目描述:

题目示例:

解法(递归-快速幂):

算法思路:

      1.递归函数的含义求出 x 的 n 次方是多少,然后返回
      2.函数体先求出 x 的 n/2 次方是多少,然后根据 n 的奇偶得出 x 的 n 次方是多少
      3.递归出口:当 n 为 0 的时候,返回 1 即可。

C++算法代码:

class Solution { public: double Pow(double x, long long n) //因为n为负数时可以取到-2^32,当转成-n时则超出int最大值,需要改成long long类型 { if(n == 0) { return 1; } double tmp = myPow(x, n / 2); return n % 2 == 0 ? tmp * tmp : tmp * tmp * x; } double myPow(double x, int n) { double ret = n < 0 ? Pow(x, -(long long)n) : Pow(x, n); if(n < 0) { ret = 1 / ret; } return ret; } };

算法总结及流程解析:

结束语

      到此,3.反转链表,4.两两交换链表中的节点,5.快速幂 这三道算法题就讲解完了。反转链表:通过递归逆序后续链表,再将当前节点接在尾部;两两交换链表节点:递归处理后续链表后交换当前两个节点;快速幂:利用分治思想递归计算x的n次方。希望大家能有所收获!

Read more

我爱学算法之—— 前缀和(上)

我爱学算法之—— 前缀和(上)

一、【模板】前缀和 题目解析 这道题,给定一个长度为n的数组,和m次询问; 每一次询问给出两个整数l和r,让我们求出区间[l , r]中所有数的和,然后输出。 算法思路 这道题暴力解法: 首先是m次查询(m次测试),每一个给定一个l和r,让我们求区间[l , r]中所有数的和。 暴力解法就非常简单了,直接遍历区间[l , r],求出区间中所有数的和即可。 暴力解法时间复杂度O(m * n),也就是O(n^2)级别的时间复杂度; 暴力解法会超时,我们这里想一想可不可以对暴力解法进行一些优化: 1. 首先m次查询,很显然是不能进行优化的。 2. 我们只能对求区间[l , r]中所有数的和进行优化。 那如何优化呢? 遍历区间[l , r]来求和时间复杂度是O(n)

By Ne0inhk

PDFShuffler:简单高效的PDF页面管理工具终极指南

PDFShuffler:简单高效的PDF页面管理工具终极指南 【免费下载链接】pdfarranger 项目地址: https://gitcode.com/gh_mirrors/pdf/pdfshuffler PDFShuffler是一款开源免费的PDF页面管理软件,专为需要重新排列、合并、拆分PDF文件的用户设计。无论您是学生整理讲义、商务人士整合报告,还是普通用户处理日常文档,PDFShuffler都能让PDF操作变得轻松简单! 为什么选择PDFShuffler? 🎯 完全免费开源 PDFShuffler基于MIT许可证开源,这意味着您可以免费使用所有功能,无需担心版权问题。开源社区持续维护,确保软件稳定性和功能更新。 🚀 跨平台兼容 基于Python和PyQt开发,PDFShuffler完美支持Linux、Windows和Mac OS三大主流操作系统,让您在不同设备上都能享受一致的PDF编辑体验。 👆 直观易用的界面 从截图中可以看到,PDFShuffler的界面设计非常直观: * 网格视图:以缩略图形式清晰展示所有PDF页面 * 拖拽排序:只需

By Ne0inhk
直流无刷电机FOC控制算法

直流无刷电机FOC控制算法

文章目录 * 1、FOC概述 * 1.1 FOC控制算法介绍 * 2、无刷电机 * 2.1 无刷电机介绍 * 2.2 无刷电机和永磁同步电机的区别 * 2.3 无刷电机的控制原理 * 2.3.1 无刷电机工作原理 * 2.3.2 直流无刷电机驱动原理 * 2.3.2.1 有感直流无刷电机六步换相驱动原理 * 2.3.2.2 直流无刷电机FOC控制原理 * 3、无刷电机FOC控制算法 * 3.1 FOC控制算法整体流程 * 3.2 FOC算法Clarke变换 * 3.2.1 Clarke变换公式推导 * 3.2.2

By Ne0inhk

数据结构七大排序算法图解——选择排序动图演示

系列文章目录 四、选择排序 紧接上一篇交换排序 前言: 1、直接选择排序 思想: 例题: 代码部分: 性能分析 2、树形选择排序 思想: 例题一: 例题二: 性能分析 3、堆排序 定义: 方法: 如何“筛选”? 例题: 如何“建初始堆”? 例题: 代码部分 性能分析 4、总结 直接选择排序 树形排序 堆排序 前言: 选择排序的主要思想是每一趟从待排序列中选取一个关键字值最小的记录,也即第 1 趟从 n 个记录中选取关键字值最小的记录,在第 2 趟中,从剩下的 n-1 个记录中选取关键字值最小的记录,直到整个序列中的记录都选完位置。这样,由选取记录的顺序便可得到按关键字值有序的序列。

By Ne0inhk