题目:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
方法一:使用栈实现(代码复杂,但代码的鲁棒性高)
因为单链表只能从头到尾遍历,可输出顺序又是从尾到头,是一个典型的“先进后出”结构,所以我们很容易想到栈来实现这种顺序,经过一个节点时把结点放入一个栈中,遍历完整个链表后再从栈顶逐个输出结点的值。
代码:
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> out;
stack<ListNode*> nodes;
ListNode* pNode = head;
while (pNode != NULL){
nodes.push(pNode);
pNode = pNode->next;
}
while (!nodes.empty()){
pNode = nodes.top();
out.push_back(pNode->val);
nodes.pop();
}
}
};
方法二:递归实现(代码简洁,但链表很长时函数调用层级很深,有可能导致函数调用栈溢出)
因为递归的本质就是一个栈结构,所以我们当然可以把上述过程以递归形式表达出来,每访问到一个结点时先递归输出它后面的结点,在输出该结点。
代码:
class Solution {
public:
vector<int> out;
vector<int> printListFromTailToHead(ListNode* head) {
if (head != NULL){
if (head->next != NULL){
printListFromTailToHead(head->next);
}
out.push_back(head->val)
}
return out;
}
};