刷题路程第一天2
剑指offer——从尾到头打印链表
题目描述:
输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
输入:
{67,0,24,58}
输出:
[58,24,0,67]
宅宅的第二道题开始了。
这一题乍一看也不难,好写!
思路就是把链表的数据先存入到一个数组里,之后再把数组逆序,噼里啪啦写完了。
运行成功。
代码如下:
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) :
* val(x), next(NULL) {
* }
* };
*/
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
int i=0,j;vector <int> arr;
while(head!=NULL)
{
arr.push_back(head->val);
head=head->next;
i++;
//cout<<
}
vector <int> arr2;
int len=arr.size();
for(j=1;j<=i;j++)
{
arr2.push_back(arr[len-j]);
}
return arr2;
}
};
不熟悉vector的小伙伴可以点这里
虽然是写出来了,但是宅宅感觉这样太麻烦了,去翻了翻了题解,发现有更好的方法:
1.利用栈后进先出的特性。
2.用反向迭代器(想了解的可以点这里)。
或者是c++自带的reverse翻转函数;
3.递归(好家伙,这方法我可是想不出来)
宅宅就去翻了翻这个东西,好家伙。
1的代码如下:
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> arr;
ListNode *p=NULL;
p=head;
stack<int> stk;
while(p!=NULL){
stk.push(p->val);
p=p->next;
}
while(!stk.empty()){
arr.push_back(stk.top());
stk.pop();
}
return arr;
}
};
2的代码如下:
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) :
* val(x), next(NULL) {
* }
* };
*/
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector <int> arr;
while(head!=NULL)
{
arr.push_back(head->val);
head=head->next;
}
return vector <int>(arr.rbegin(),arr.rend());
}
};
3的代码如下:
class Solution {
public:
vector<int> arr;
vector<int> printListFromTailToHead(ListNode* head) {
ListNode *p=NULL;
p=head;
if(p!=NULL){
if(p->next!=NULL){
printListFromTailToHead(p->next);
}
arr.push_back(p->val);
}
return arr;
}
};