题目:
输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
解法一:使用栈
空间复杂度 O(n), 时间复杂度O(n)
- 使用辅助空间栈,从头开始遍历链表,将链表中的元素依次入栈。
- 将栈中元素依次弹出。
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) :
* val(x), next(NULL) {
* }
* };
*/
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int>vec;
if(head == NULL)
return vec;
stack<ListNode* >s;
ListNode* p = head;
while(p != NULL)
{
s.push(p);
p = p->next;
}
while(!s.empty())
{
p = s.top();
s.pop();
vec.push_back(p->val);
}
return vec;
}
};
解法二:递归
递归在本质上也是一个栈,所以可以用递归来实现链表的倒叙输出。
- 从头到尾,每次遍历一个元素,
- 递归遍历到最后一个元素时,再依次返回每个元素,添加到vector中(这时添加的顺序就是从尾到头的了)。
注意:当链表比较长的时候,不宜采用递归的方法,可能会导致函数调用栈溢出。
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) :
* val(x), next(NULL) {
* }
* };
*/
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int>vec;
if(head == NULL)
return vec;
Print(head, vec);
return vec;
}
void Print(ListNode* head, vector<int > &v)
{
if(head!=NULL)
{
Print(head->next, v);
v.push_back(head->val);
}
}
};
解法三:
思路,前两个解法都是不改变链表,现在将链表改为从尾到头串联,然后依次遍历链表,就可以达到原链表的从尾到头打印。