跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
C++算法

递归算法实战:从汉诺塔到快速幂与链表操作

递归算法实战涵盖汉诺塔问题分解、链表合并与反转、节点交换及快速幂优化。通过 C++ 代码示例详解递归终止条件与状态转移,解析基础数据结构在面试中的常见解法与实现细节。

abccba发布于 2026/3/23更新于 2026/5/66 浏览
递归算法实战:从汉诺塔到快速幂与链表操作

递归算法实战:从汉诺塔到快速幂与链表操作

本文涉及专题一算法题链接

  • 面试题 08.06. 汉诺塔问题
  • 21. 合并两个有序链表
  • 206. 反转链表
  • 24. 两两交换链表中的节点
  • 50. Pow(x, n)

1 汉诺塔问题

题目描述

汉诺塔示意图

汉诺塔问题(递归解法)

1. 问题描述

汉诺塔是经典的递归问题,规则如下:

  • 有三根柱子,记为 A(起始柱)、B(辅助柱)、C(目标柱)。
  • A 柱上有 n 个盘子,从小到大叠放(从上到下编号为 1 到 n)。
  • 目标是将所有盘子从 A 移到 C,每次只能移动一个盘子,并且大盘子不能放在小盘子上面。

汉诺塔移动示意

2. 递归思想
基本情况(递归终止条件)

当 n = 1 时,直接将 A 最上面的盘子移到 C。

递归分解(n ≥ 2)

若要将 A 上的 n 个盘子移到 C,可以分解为三个步骤:

  1. 将 A 上除了最底下的盘子(即上面 n-1 个盘子)移到 B(借助 C 作为辅助柱)。
  2. 将 A 最底下的最大盘子移到 C。
  3. 将 B 上的 n-1 个盘子移到 C(借助 A 作为辅助柱)。

这样,规模为 n 的问题被拆分为两个规模为 n-1 的子问题。

3. 递归算法流程(函数设计)
函数头
void hanoi(vector<int>& A, vector<int>& B, vector<int>& C, int n);
  • 返回值:无
  • 参数:三个柱子上的盘子,当前需要处理的盘子个数(当前问题规模)
  • 函数作用:将 A 中的上面 n 个盘子挪到 C 中
递归函数流程
  1. 当前问题规模为 n=1 时,直接将 A 中的最上面盘子挪到 C 中并返回;
  2. 递归将 A 中最上面的 n-1 个盘子挪到 B 中;
  3. 将 A 中最上面的一个盘子挪到 C 中;
  4. 将 B 中上面 n-1 个盘子挪到 C 中。

解题过程

汉诺塔执行过程 1

汉诺塔执行过程 2

汉诺塔执行过程 3

算法实现(C++)

class Solution {
public:
    void hanota(vector<int>& a, vector<int>& b, vector<int>& c) {
        dfs(a, b, c, a.size());
    }
    
    void dfs(vector<int>& a, vector<int>& b, vector<int>& c, int n) {
        if (n == 1) {
            c.push_back(a.back());
            a.pop_back();
            return;
        }
        dfs(a, c, b, n - 1);
        c.push_back(a.back());
        a.pop_back();
        dfs(b, a, c, n - 1);
    }
};

如果是笔试题且允许直接赋值,也可以简化处理:

class Solution {
public:
    void hanota(vector<int>& a, vector<int>& b, vector<int>& c) {
        c = a;
    }
};

2 合并两个有序链表

题目描述

合并链表示意图

解题过程

合并链表逻辑 1

合并链表逻辑 2

算法实现(C++)

class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        // 递归出口
        if (l1 == nullptr) return l2;
        if (l2 == nullptr) return l1;
        
        // 比大小
        if (l1->val <= l2->val) {
            l1->next = mergeTwoLists(l1->next, l2);
            return l1;
        } else {
            l2->next = mergeTwoLists(l1, l2->next);
            return l2;
        }
    }
};

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 = nullptr;
        
        // 最终返回结果
        return newhead;
    }
};

4 两两交换链表中的节点

题目描述

两两交换节点示意图

解题过程

两两交换节点逻辑

算法实现(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;
        
        // 节点为空或者是个尾节点,就不能交换
        // 宏观角度看待
        auto tmp = swapPairs(head->next->next);
        auto ret = head->next;
        head->next->next = head;
        head->next = tmp;
        
        // 返回最终结果
        return ret;
    }
};

5 Pow(x, n)

题目描述

快速幂示意图

解题过程

快速幂逻辑 1

快速幂逻辑 2

算法实现(C++)

class Solution {
public:
    double myPow(double x, int n) {
        // 主函数
        // 细节问题:n 可能是负数
        return n < 0 ? 1.0 / Pow(x, -(long long)n) : Pow(x, n);
    }
    
    double Pow(double x, long long n) {
        // 快速幂
        // 递归出口
        if (n == 0) return 1.0;
        
        // x ^ 0 = 1
        // 递归
        double tmp = Pow(x, n / 2);
        return n % 2 == 0 ? tmp * tmp : tmp * tmp * x;
    }
};

目录

  1. 递归算法实战:从汉诺塔到快速幂与链表操作
  2. 本文涉及专题一算法题链接
  3. 1 汉诺塔问题
  4. 题目描述
  5. 汉诺塔问题(递归解法)
  6. 1. 问题描述
  7. 2. 递归思想
  8. 基本情况(递归终止条件)
  9. 递归分解(n ≥ 2)
  10. 3. 递归算法流程(函数设计)
  11. 函数头
  12. 递归函数流程
  13. 解题过程
  14. 算法实现(C++)
  15. 2 合并两个有序链表
  16. 题目描述
  17. 解题过程
  18. 算法实现(C++)
  19. 3 反转链表
  20. 题目描述
  21. 解题过程
  22. 算法实现(C++)
  23. 4 两两交换链表中的节点
  24. 题目描述
  25. 解题过程
  26. 算法实现(C++)
  27. 5 Pow(x, n)
  28. 题目描述
  29. 解题过程
  30. 算法实现(C++)
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 基于 LangChain 的 ReAct AI Agent 搭建实战
  • 全栈分页方案:MyBatisPlus 后端与 Thymeleaf 前端深度整合指南
  • Spring 框架 JSR-250 注解详解
  • AI 建筑绘图提示词:从基础构建到高级实战
  • Windows 部署 Qwen2.5-Coder-7B-Instruct 模型:环境配置与 Web 界面搭建
  • 使用 KSWEB 在安卓手机部署 Typecho 博客并配置外网访问
  • OpenClaw(原 Moltbot)底层架构解析
  • Coze 与 Dify 低代码 AI 平台深度对比
  • Android Framework 核心原理与源码解析指南
  • 42 个 Python 实用小例子
  • 基于 MCP 和 Skill 的前端 JS 逆向自动化落地实践
  • Python 开发:uv 安装、配置与最佳实践
  • MCP AI Copilot 集成测试体系与能力评估标准
  • Python 自学指南:从入门到实战的完整学习路线规划
  • Android Studio 安装及核心组件配置指南(SDK、JDK、Gradle)
  • MCP 协议详解:与 Function Call 的区别及使用方法
  • Dify MCP Server 插件:将工作流发布为第三方可调用服务
  • 使用 Python 实现股票布林线策略与信号可视化
  • Python Anaconda 与 Pip 配置清华镜像源指南
  • FastAPI 架构深度解析:依赖注入、后台任务与 WebSocket 实战

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online