输入一个链表的头结点,从尾到头反过来打印出每个节点的值。链表节点定义如下:
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
解题思路1
因为题目要求是从尾往头地打印链表节点的值,而链表只能从头到尾地查找,因此是一个先入后出的过程,可以使用一个辅助栈来实现。
#include <stack>
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> ans;
stack<int> S;
while(head){
S.push(head->val);
head = head->next;
}
while(!S.empty()){
ans.push_back(S.top());
S.pop();
}
return ans;
}
解题思路2
上一种方法是借助辅助栈基于循环的方法,事实上这个问题也可以看成一个递归问题,先得到一个节点后面所有节点的倒序输出,再加上节点本身,就可以递归地解决问题。递归比起循环来说有点是代码思路更简洁。(但是递归有可能递归深度太深而导致栈溢出,因此方法一的鲁棒性更好些。)
void printCore(vector<int>&ans,ListNode* head){
if (!head) return;
printCore(ans,head->next);
ans.push_back(head->val);
}
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> ans;
printCore(ans,head);
return ans;
}