3.从尾到头打印链表
题目描述
输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
思路
常规: 考虑把链表的结点指针反转,改变方向从而可以从尾到头输出,但是会改变链表的结构,不可行。
优化: 原则上,,我们不希望修改原链表的结构。我们可以使用栈实现这种顺序。每经过一个结点的时候,把该结点放到一个栈中。当遍历完整个链表后,再从栈顶开始逐个输出结点的值,给一个新的链表结构,这样链表就实现了反转。
代码实现
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) :
* val(x), next(NULL) {
* }
* };
*/
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
stack<int> nodes; //存储结点
vector<int> result;//存出结果
ListNode* node =head; //头结点
while(node != NULL){
nodes.push(node->val); //压栈直到 头结点为空
node = node->next;
}
while (!nodes.empty()){
result.push_back(nodes.top()); // 把栈顶的元素一个一个pop出来
nodes.pop();
}
return result;
}
};