leetcode-剑指 Offer 06. 从尾到头打印链表
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例 1:
输入:head = [1,3,2]
输出:[2,3,1]
限制:
0 <= 链表长度 <= 10000
解题思路:
方法一: 遍历链表,将节点值加入到数组中,然后翻转数组。
class Solution {
public:
vector<int> reversePrint(ListNode* head) {
vector<int> ans;
while(head)
{
ans.push_back(head->val);
head=head->next;
}
reverse(ans.begin(),ans.end());
return ans;
}
};
用vector的insert性质改进
class Solution {
public:
vector<int> reversePrint(ListNode* head) {
vector<int> ans;
while(head)
{
ans.insert(ans.begin(),head->val);//在ans头部插入
head=head->next;
}
return ans;
}
};
方法二: 递归/回溯法
class Solution {
void method(ListNode *head,vector<int>& ans)
{
if(head==NULL) return;
method(head->next,ans);
ans.push_back(head->val);
}
public:
vector<int> reversePrint(ListNode* head) {
vector<int> ans;
method(head,ans);
return ans;
}
};
简洁
class Solution {
vector<int> ans;
public:
vector<int> reversePrint(ListNode* head) {
ans.clear();
if(head==NULL) return ans;
reversePrint(head->next);
ans.push_back(head->val);
return ans;
}
};
方法三: 栈(栈其实是充当reverse的功能)
class Solution{
public:
vector<int> reversePrint(ListNode* head)
{
stack<int> st;
vector<int>ans;
while(head)
{
st.push(head->val);
head=head->next;
}
while(!st.empty())
{
ans.push_back(st.top());
st.pop();
}
return ans;
}
};