题目描述
书店店员有一张链表形式的书单,每个节点代表一本书,节点中的值表示书的编号。为更方便整理书架,店员需要将书单倒过来排列,就可以从最后一本书开始整理,逐一将书放回到书架上。请倒序返回这个书单链表。
示例:
输入:head = [3,6,4,1]
输出:[1,4,6,3]
提示:0 <= 链表长度 <= 10000
解题思路
方案一:基于 vector 的容器特性优化
对于初学者而言,直接操作链表指针容易出错。我们可以利用 C++ 标准库的特性,先将链表数据读入 vector,再反转容器。
- 读取整行输入:使用
getline(cin, s)解决cin >>只读取单词的问题,支持带空格的输入。 - 解析字符串:利用
stringstream将空格分隔的字符串转换为整数流,自动跳过空白符。 - 一键反转:使用
vector的反向迭代器rbegin()/rend()构造新向量,代码极简且不易出错。
方案二:链表 + 递归(算法核心)
虽然数组解法便捷,但本题考察的是链表操作。递归是处理链表问题的经典手段,核心在于「递推到末端,回溯时收集」。步骤如下:
- 终止条件:当
head == nullptr时,代表遍历到链表尾。 - 递推工作:递归访问下一个节点
head->next。 - 回溯阶段:从末端开始,依次将当前节点值加入结果列表,天然实现倒序。
C++ 代码实现
基础版:Vector 反向迭代器
#include <vector>
#include <string>
#include <iostream>
#include <sstream>
using namespace std;
int main() {
string s;
getline(cin, s); // 读取整行输入
stringstream ss(s);
int num;
vector<int> res;
(ss >> num) {
res.(num);
}
;
( i = ; i < reversedRes.(); i++) {
cout << reversedRes[i];
(i < reversedRes.() - ) {
cout << ;
}
}
;
}

