输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
- 利用栈的先进后出,先将元素入栈,再将元素从栈中放到vector中:用时3s,占存408k
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
struct ListNode{
int val;
struct ListNode *next;
ListNode(int x):val(x),next(NULL){}
};
vector<int> printListFromTailToHead(ListNode* head) {
stack<int> tmp;
ListNode* tmpListNode = head;
while(tmpListNode)
{
tmp.push(tmpListNode->val);
tmpListNode=tmpListNode->next;
}
vector<int> result;
while(!tmp.empty())
{
int tt = tmp.top();
result.push_back(tt);
tmp.pop();
}
return result;
}
int main()
{
ListNode* head=new ListNode(1);
ListNode* pListN=head;
for(int i=2;i<6;i++)
{
ListNode* tmp=new ListNode(i);
pListN->next=tmp;
pListN=tmp;
}
vector<int> result = printListFromTailToHead(head);
for(auto i:result)
{
cout<<i<<endl;
}
return 0;
}
- 利用vector的逆序遍历,rbegin()和rend():用时4s,占存604k
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
struct ListNode{
int val;
struct ListNode *next;
ListNode(int x):val(x),next(NULL){}
};
vector<int> printListFromTailToHead(ListNode* head) {
ListNode* tmpListNode = head;
vector<int> result;
while(tmpListNode)
{
result.push_back(tmpListNode->val);
tmpListNode=tmpListNode->next;
}
return vector<int>(result.rbegin(),result.rend());
}
int main()
{
ListNode* head=new ListNode(1);
ListNode* pListN=head;
for(int i=2;i<6;i++)
{
ListNode* tmp=new ListNode(i);
pListN->next=tmp;
pListN=tmp;
}
vector<int> result = printListFromTailToHead(head);
for(auto i:result)
{
cout<<i<<endl;
}
return 0;
}
- 利用vector的insert()函数指定每次从头插入新元素:用时3s,占存460k
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
struct ListNode{
int val;
struct ListNode *next;
ListNode(int x):val(x),next(NULL){}
};
vector<int> printListFromTailToHead(ListNode* head) {
ListNode* tmpListNode = head;
vector<int> result;
while(tmpListNode)
{
result.insert(result.begin(),tmpListNode->val);
tmpListNode=tmpListNode->next;
}
return result;
}
int main()
{
ListNode* head=new ListNode(1);
ListNode* pListN=head;
for(int i=2;i<6;i++)
{
ListNode* tmp=new ListNode(i);
pListN->next=tmp;
pListN=tmp;
}
vector<int> result = printListFromTailToHead(head);
for(auto i:result)
{
cout<<i<<endl;
}
return 0;
}
- 利用递归:用时4s,占存492k(这里有个问题,存放递归函数返回值的vector必须得是全局的变量,不然存储不上递归返回的值。菜鸟一只,不知道这个见解对不对,哈哈)
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
struct ListNode{
int val;
struct ListNode *next;
ListNode(int x):val(x),next(NULL){}
};
vector<int> result;
vector<int> printListFromTailToHead(ListNode* head) {
if(!head) return result;
printListFromTailToHead(head->next);
result.push_back(head->val);
return result;
}
int main()
{
ListNode* head=new ListNode(1);
ListNode* pListN=head;
for(int i=2;i<6;i++)
{
ListNode* tmp=new ListNode(i);
pListN->next=tmp;
pListN=tmp;
}
vector<int> result = printListFromTailToHead(head);
for(auto i:result)
{
cout<<i<<endl;
}
return 0;
}
思路可参考如下文章: