1-Description
输入一个链表,按链表值从尾到头的顺序返回一个ArrayList,链表定义如下:
struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { } };
2-Solution
下面提供3种思路:
- 第一种是先对链表进行从头到尾的一次遍历,并将链表值存入vector,最后对vector翻转,这样即可得到逆序存储的链表值。
- 第二种思路得益于栈结构的先入后出的特点,正序入栈,逆序出栈。
- 第三种利用递归来实现,递归本质上是一个栈结构,所以在每次访问到一个节点的时候,先递归输出其后面的节点,再输出该节点本身,这样链表值就得到了逆序。
1-正序遍历并存储,逆序输出
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> vecval;
while(head != NULL){
vecval.push_back(head->val);//按照正序将链表值存入vector
head = head->next;
}
reverse(vecval.begin(),vecval.end());//这里得益于reverse()函数,对vector进行逆序
return vecval;
}
};
2-正序入栈,逆序出栈
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> vecval;
ListNode *p=NULL;
p=head;
stack<int> stk;
while(p!=NULL){
stk.push(p->val);//入栈操作
p=p->next;
}
while(!stk.empty()){
vecval.push_back(stk.top());//出栈
stk.pop();
}
return vecval;
}
};
3-递归实现
class Solution {
public:
vector<int> vecval;//输出的数组应是全局的!
vector<int> printListFromTailToHead(ListNode* head) {
ListNode *p=NULL;
p=head;
if(p!=NULL){
if(p->next!=NULL){
printListFromTailToHead(p->next);
}
vecval.push_back(p->val);
}
return vecval;
}
};