一、题目描述与要求
从尾到头打印链表_牛客题霸_牛客网 (nowcoder.com)
题目描述
输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。
如输入{1,2,3}的链表如下图:
返回一个数组为[3,2,1]
0 <= 链表长度 <= 10000
示例
示例1:
输入:{1,2,3}
返回值:[3,2,1]
示例2:
输入:{67,0,24,58}
返回值:[58,24,0,67]
二、解题思路
思路①【利用vector的reverse函数】
函数参数所给的是指向头结点的指针,返回值为vector容器,因此我们可以直接按顺序将链表中的数据存入vector,然后利用reverse函数对容器内容进行翻转,即可得到对应结果。
思路②【利用栈】
因为题目要求是需要我们从尾到头打印链表,而栈的结构特点就是后进先出,因此我们可以把链表里面的数据压入栈中后依次弹出存入vector里面。
思路③【利用递归遍历】
想要从尾到头打印链表,那么我们需要找到链表的最后一个结点,将其数据存入vector,然后再依次往前。这就可以利用递归遍历的思路,对整个链表进行遍历直至最后一个结点,然后把其存入vector后返回到上一层递归。
三、具体代码
思路①
#include <algorithm>
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> v;
while(head){
v.push_back(head->val);
head=head->next;
}
reverse(v.begin(),v.end());
return v;
}
};
思路②
#include <algorithm>
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> v;
stack<int> s;
while(head){
s.push(head->val);
head=head->next;
}
while(!s.empty()){
v.push_back(s.top());
s.pop();
}
return v;
}
};
思路③
#include <algorithm>
class Solution {
public:
void recursion(ListNode* head,vector<int>& v){
if(head!=NULL){
recursion(head->next, v);
v.push_back(head->val);
}
}
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> v;
recursion(head, v);
return v;
}
};