当前位置: 首页 > news >正文

C++基础(④链表反转(链表 + 迭代 / 递归))

链表反转(链表 + 迭代 / 递归)
题目描述:给你单链表的头节点 head,请你反转链表,并返回反转后的链表头节点。
示例:输入链表 1→2→3→4→5 → 输出 5→4→3→2→1。
思路提示:

迭代法:用三个指针 prev(前一个节点,初始 nullptr)、curr(当前节点,初始 head)、next(临时存储下一个节点),遍历链表时依次修改 curr->next = prev,再更新三个指针。
递归法:递归反转 head 的下一个节点,再将 head 接到反转后的链表尾部,时间复杂度 O (n),空间复杂度 O (n)(递归栈)。

#include <iostream>using namespace std;// ---------- 1. 节点定义 ----------
struct ListNode {int val;ListNode* next;ListNode(int v = 0, ListNode* n = nullptr) : val(v), next(n) {}
};// ---------- 2. 迭代法 ----------
ListNode* reverseList_iter(ListNode* head) {ListNode* prev = nullptr;   // 新链表的头ListNode* curr = head;      // 正在处理的节点while (curr) {ListNode* nextTmp = curr->next; // 临时保存下一个curr->next = prev;             // 反向prev = curr;                   // prev 前进一步curr = nextTmp;                // curr 前进一步}return prev;  // prev 变成新头节点
}// ---------- 3. 递归法 ----------
ListNode* reverseList_recur(ListNode* head) {if (!head || !head->next) return head;   // 空或最后一个节点ListNode* newHead = reverseList_recur(head->next); // 先反转后面的链表head->next->next = head;   // 把当前节点接到已反转部分的尾巴head->next = nullptr;      // 防止成环return newHead;
}// ---------- 4. 辅助:打印链表 ----------
void printList(ListNode* head) {for (ListNode* p = head; p; p = p->next)cout << p->val << (p->next ? "→" : "");cout << endl;
}// ---------- 5. 测试 ----------
int main() {// 构造 1→2→3→4→5ListNode* head = new ListNode(1);head->next = new ListNode(2);head->next->next = new ListNode(3);head->next->next->next = new ListNode(4);head->next->next->next->next = new ListNode(5);cout << "Original: "; printList(head);// 迭代版ListNode* newHead_iter = reverseList_iter(head);cout << "Reversed (iter): "; printList(newHead_iter);// 递归版(再反转回来演示)ListNode* newHead_recur = reverseList_recur(newHead_iter);cout << "Re-reversed (recur): "; printList(newHead_recur);return 0;
}

拆解 1:构造函数的参数与默认值
构造函数 ListNode(int v = 0, ListNode* n = nullptr) 有两个参数:

int v:用于初始化 val(节点数据),默认值为 0
ListNode* n:用于初始化 next(下一个节点指针),默认值为 nullptr(空指针)

默认参数的作用:调用构造函数时,可以不传参数、传 1 个参数或传 2 个参数,非常灵活。

拆解 2:初始化列表 : val(v), next(n)
这是 C++ 的初始化列表语法,作用是在构造函数体执行前,直接初始化成员变量:

val(v):将成员变量 val 初始化为参数 v 的值
next(n):将成员变量 next 初始化为参数 n 的值

相比在构造函数体内赋值(如 val = v;),初始化列表更高效,尤其适合 const 成员或自定义类型成员的初始化。

http://www.dtcms.com/a/356484.html

相关文章:

  • Linux - 中文显示乱码问题解决方法(编码查看及转换)- 学习/实践
  • 对于牛客网—语言学习篇—编程初学者入门训练—函数类型:BC156 牛牛的数组匹配及BC158 回文数解析
  • Total PDF Converter多功能 PDF 批量转换工具,无水印 + 高效处理指南
  • docker 搭建zookper集群,快照虚拟机多机模拟
  • 2025数学建模国赛AI提示词模板
  • 如何解决网关断网后时间不再统计的问题?无RTC子设备如何打通主网关的时间同步功能?
  • 法律审查prompt收集
  • 高并发内存池(19)-用基数树优化
  • IDA-pro-mcp 的核心功能 常用的prompt
  • Mybatis的常用标签
  • word去空格去空行_word辅助工具 word批量处理
  • 【C++】类与对象(上)
  • Matlab实现基于CPO-QRCNN-BiGRU-Attention注意力多变量时间序列区间预测
  • FPGA实现1553B BC控制器IP方案
  • 【AOSP】Android Dump 开发与调试指南
  • Replay – AI音乐伴奏分离工具,自动分析音频内容、提取主唱、人声和伴奏等音轨
  • 栈和队列OJ习题
  • 【物联网】关于 GATT (Generic Attribute Profile)基本概念与三种操作(Read / Write / Notify)的理解
  • 如何在mysql中执行创建数据库的脚本文件?
  • Spring Boot 使用 RestTemplate 调用 HTTPS 接口时报错:PKIX path building failed 解决方案
  • Linux下的网络编程SQLITE3详解
  • 神经语言学视角:脑科学与NLP深层分析技术的交叉融合
  • Java的CAS机制:无锁并发控制及其高频面试题
  • OpenCSG月度更新2025.8
  • 1 分钟 Maya 动画渲染要多久?5 天还是 5 小时
  • 基于Java、GeoTools与PostGIS的GeoJSON动态属性注入实战指南
  • 在 Go 项目的 DDD 分层架构中,Echo Web 框架及其 middleware 应该归属到哪一层?
  • mysql安全运维之安全模型与原则-构建坚不可摧的数据库防护体系
  • 自然语言提取PDF表格数据
  • 电影交流|基于SprinBoot+vue的电影交流平台小程序系统(源码+数据库+文档)