1.题目
输入一个链表,按链表值从尾到头的顺序返回一个Vector。
2.思路
2.1 思路1
现将链表反转,然后在从头到尾输出。但这种方法会改变原来链表的结构。
时间复杂度:
空间复杂度:
2.2 辅助栈
遍历链表的顺序是从头到尾,输出的顺序是从尾到头。也就是说,第一个遍历到的节点最后一个输出,最后一个遍历到的节点第一个输出。这就是典型的“后进先出”,可以用栈实现这样的顺序。
3.实现
思路1的实现
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> res;
ListNode* newHead = reverseList(head);
while(newHead != nullptr)
{
res.push_back(newHead->val);
newHead = newHead->next;
}
return res;
}
ListNode* reverseList(ListNode* head) {
//反转链表
if(head == nullptr)
return head;
ListNode* pre = nullptr;
ListNode* cur = head;
ListNode* nex = nullptr;
while(cur != nullptr)
{
nex = cur->next;
cur->next = pre;
pre = cur;
cur = nex;
}
return pre;
}
};
思路2的实现
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> res;
stack<int> helper;
while(head != nullptr)
{
helper.push(head->val);
head = head->next;
}
while(!helper.empty())
{
res.push_back(helper.top());
helper.pop();
}
return res;
}
};