提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
题目地址
题目描述:
一、看到题目该如何下手?
首先,本题是要求倒叙的打印一个链表,最常规的想法,可能是先把链表原地倒置,但是在遍历打印。的确是这样的,思路可以顺着这个来,我们是否可以想到其他的方法呢?
此题还可以联想到栈,先进后出,那就可以将链表先一次押入到栈中,然后在依次从栈顶弹出给一个新链表。
二、根据思路编写代码
考虑 到可能语言的问题,此代码用python和c++两种语言给大家展示。
1.python(2.7)代码
python2与python3还是有些区别的,大家可以自行百度查看区别,大部分都是一样的。
代码如下:
# -*- coding:utf-8 -*-
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def printListFromTailToHead(self, listNode):
result = [] #一个空list,python中没有栈这种结构,可以模拟一个
while listNode:
result.insert(0,listNode.val)#每次都将数据插入到列表的第一个数据
listNode = listNode.next#链表后移
return result#返回最终的结果
# write code here
2.C++11(clang++3.9)代码
至于C++11或者C++14、C++19等,大家也可以自行百度查看
代码如下:
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) :
* val(x), next(NULL) {
* }
* };
*/
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> new_link;
ListNode *p = NULL;
p = head;//移动指针
stack<int> stack1;//一个栈
while(p!=NULL){//当p不空的时候,依次将值押入栈中。
stack1.push(p->val);
p = p->next;
}
while(!stack1.empty()){//当栈非空时,将数据从栈顶依次push新的vector容器中
new_link.push_back(stack1.top());//将栈顶押入容器中
stack1.pop();//栈顶出栈
}
return new_link;//返回最终结果
}
};
三、总结
提示:本题思维并非唯一,还有其他的做法,欢迎大家在评论区讨论交流,关于链表的一些操作也是面试和机考的常考题型,大家要多思考,多总结。