题目要求
输入一个链表,按链表值从尾到头的顺序返回一个数组。
解题思路
分析题目要求,我们能知道第一个遍历的元素需要最后再输出,而最后一个元素需要第一个输出。根据这个“先进后出”要求,我们很自然的能行到用栈去操作,首先将链表的元素依次放入栈中,入栈完毕后栈顶元素就是链表的最后一个元素,然后一个个的输出栈内元素即可完成要求。
当然,由于递归的操作就是基于栈进行实现的,所以我们还可以通过递归实现题目中的要求。
主要代码c++
用栈迭代:
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) :
* val(x), next(NULL) {
* }
* };
*/
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int>res;
if(head==NULL) return res;
stack<ListNode*>s;
ListNode* p = head;
while(p)
{
s.push(p);// 元素进栈操作
p = p->next;
}
while(!s.empty())
{
ListNode* tmp = s.top();//元素出栈,保存数值
s.pop();
res.push_back(tmp->val);
}
return res;
}
};
递归:
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
if(head!=NULL)
{
printListFromTailToHead(head->next);
res.push_back(head->val);
}
return res;
}
private:
vector<int>res; //用来保存结果
};
主要代码 python
class Solution:
# 返回从尾部到头部的列表值序列,例如[1,2,3]
def printListFromTailToHead(self, listNode):
# write code here
lst, lst_bak = [], []
if not listNode:
return lst
while listNode: # 借助list实现栈
lst.append(listNode.val)
listNode = listNode.next
while lst:
lst_bak.append(lst.pop())
return lst_bak
总结
实际上,当第一次拿到这个题目时,我想的先反转链表,然后顺序遍历链表的值,但是我们需要注意的一定要和面试官确认,我们是否可以修改输入数据(改变链表的结构),通常情况下打印操作是只读的,不需要修改数据。
在本题中熟记两个操作即可:
所有元素进栈,元素依次出栈。(达到反转的效果)
要记住,当输出顺序和输入顺序相反的时候,我们可以巧妙地使用栈这个结构。并且递归也是基于栈的操作。合理的利用栈和递归操作会让我们在解题时候大大的提高效率。但是递归操作不适用于元素非常多的时候,这点也是要考虑的。