跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

递归算法专题:汉诺塔、链表操作与快速幂

综述由AI生成递归算法专题涵盖汉诺塔问题的递归解法、合并两个有序链表、反转链表、两两交换链表节点以及快速幂算法。通过 C++ 代码实现,解析了递归终止条件、分解步骤及链表指针操作细节,适合算法基础学习。

黑客发布于 2026/3/29更新于 2026/6/722 浏览
递归算法专题:汉诺塔、链表操作与快速幂

在这里插入图片描述

本文设计专题一算法题链接

面试题 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 作为辅助柱)。
  • 将 A 最底下的最大盘子移到 C。
  • 将 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 中。

    解题过程

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    算法实现(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);
        }
    };
    

    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)

    题目描述

    在这里插入图片描述

    解题过程

    在这里插入图片描述

    在这里插入图片描述

    算法实现(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. 1 汉诺塔问题
    3. 题目描述
    4. 汉诺塔问题(递归解法)
    5. 1. 问题描述
    6. 2. 递归思想
    7. 基本情况(递归终止条件)
    8. 递归分解(n ≥ 2)
    9. 3. 递归算法流程(函数设计)
    10. 函数头
    11. 递归函数流程:
    12. 解题过程
    13. 算法实现(C++)
    14. 2 合并两个有序链表
    15. 题目描述
    16. 解题过程
    17. 算法实现(C++)
    18. 3 反转链表
    19. 题目描述
    20. 解题过程
    21. 算法实现(C++)
    22. 4 两两交换链表中的节点
    23. 题目描述
    24. 解题过程
    25. 算法实现(C++)
    26. 5 Pow(x, n)
    27. 题目描述
    28. 解题过程
    29. 算法实现(C++)
    • 💰 8折买阿里云服务器限时8折了解详情
    • Magick API 一键接入全球大模型注册送1000万token查看
    • 🤖 一键搭建Deepseek满血版了解详情
    • 一键打造专属AI 智能体了解详情
    极客日志微信公众号二维码

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

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

    更多推荐文章

    查看全部
    • SMOTE 算法详解:解决不平衡数据问题的有效工具
    • ComfyUI 与 Hugging Face 模型共享快速上手指南
    • Python 新手必备的 5 个编程练习网站指南
    • AI 写作实战:自动写作助手的设计与实现
    • LFM2.5-1.2B-Thinking 模型在 Ollama 上的多场景应用:写作、代码与学习
    • 计算机视觉:语义分割之 FCN-8s 算法
    • 使用 auto-py-to-exe 将 Python GUI 程序打包为 exe 文件
    • Java 线程池 ThreadPoolExecutor 入门:原理、核心参数与图解
    • Kiro 安装与使用指南:AWS 新一代 AI IDE 两种部署方式
    • B 站网页版自动开启字幕用户脚本(2026 适配)
    • 阿里开源纯前端浏览器自动化 PageAgent 技术解析
    • 基于 Sentry 自建前端错误监控系统实战
    • Ollama 模型家族深度横评:Llama、Mistral、Gemma 对比指南
    • AI 绘画建筑设计提示词:从基础到高级的完整指南
    • 前端状态管理指南:Redux Toolkit、Zustand 与 Jotai 对比
    • ALVR 项目完全使用指南:实现 VR 远程显示方案
    • .NET Web API 控制器与 Action 注解详解
    • TCP TIME_WAIT 状态的作用及服务端状态过多原因
    • 大模型技术解析:定义、分类及应用展望
    • 利用腾讯云 HAI 与 DeepSeek 快速搭建响应式个人网页

    相关免费在线工具

    • 加密/解密文本

      使用加密算法(如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