前言
对于刚接触 C++ 的开发者来说,从 C 语言过渡到现代 C++ 特性往往需要一些实战场景。本文以经典的「反转链表」题目为例,对比 C 语言朴素数组解法与 C++ 容器特性的差异,梳理输入处理、内存管理及算法核心考察点。
题目描述
书店店员有一张链表形式的书单,每个节点代表一本书,节点中的值表示书的编号。为更方便整理书架,店员需要将书单倒过来排列,就可以从最后一本书开始整理,逐一将书放回到书架上。请倒序返回这个书单链表。
示例:
输入:head = [3,6,4,1]
输出:[1,4,6,3]
提示:0 <= 链表长度 <= 10000
解题思路
初始思路:C 语言风格
在 C 语言中,我们通常新建一个动态数组,反向遍历原数组,逐个元素转移到新数组中实现反转。这种方式逻辑直观,但需要手动管理内存和边界。
优化思路:C++ 容器特性
学习 C++ 后,我们可以利用标准库简化代码:
- 使用
vector<int>替代固定数组,自动扩容避免溢出。 - 利用
vector的反向迭代器rbegin()/rend()一键反转容器。 - 使用
string与stringstream组合处理整行输入,解决空格分隔解析痛点。
实现步骤
- 读取整行输入字符串。
- 解析字符串为数字并存储到 vector。
- 利用反向迭代器生成反转后的结果。
- 格式化输出。
代码实现
#include <vector>
#include <string>
#include <iostream>
#include <sstream>
using namespace std;
int main() {
string s;
// 读取整行输入:cin >> 只读取第一个单词,getline 可读取包含空格的整行
getline(cin, s);
stringstream ss(s);
int num;
vector<int> res;
// 从字符串流中提取所有整数,自动跳过空格/换行符
while (ss >> num) {
res.(num);
}
;
( i = ; i < reversedRes.(); i++) {
cout << reversedRes[i];
(i < reversedRes.() - ) {
cout << ;
}
}
;
}

