首先,拿到题之后,我们还是先从题目入手,只有掌握题干的意思,才能进行接下来的解题操作。
示例1
输入 : {1,2,3}
返回值:[3,2,1]
示例2
输入 :{67,0,24,58}
返回值:[58,24,0,67]
解题方法
a)直接遍历法
b)递归思想
c)栈思想
题目解析:
思路:
代码如下:
class Solution {
public:
vector printListFromTailToHead(ListNode* head) {
vectorarr; //开辟的数组用来存放链表中的值
while(head)
{
arr.push_back(head->val); //进行遍历操作,把元素插入数组
head=head->next;
}
reverse(arr.begin(),arr.end());//最后反转数组即可
return arr;
}
};
性能分析:
首先解答一下什么是递归:
思路:
代码如下:
//递归思想
void recursion(ListNode* head,vector&arr)
{
if(head != NULL)
{
recursion(head->next,arr); //如果当前指针不为空,则一直往后进行递归操作
arr.push_back(head->val); //遇到尾节点后开始返回,每次返回依次添加一个值进入输出数组
}
}
class Solution {
public:
vector printListFromTailToHead(ListNode* head) {
vectorarr; //还是跟之前一样,开辟一个数组用来存放链表中结点的值
recursion(head,arr); //递归调用去进行查看
return arr;
}
};
性能分析:
首先认识一下栈
首先,站的基本思想就是先进后出,如果对栈不了解的,可以参考这篇文章 栈的实现 ,它的基本思想满足本题中对链表进行从尾到头输出的条件。
思路:
代码如下:
//栈思想
class Solution {
public:
vector printListFromTailToHead(ListNode* head) {
vectorarr; //还是跟之前一样,开辟一个数组用来存放链表中结点的值
stack str; //定义的栈
while(head != NULL)
{
str.push(head->val); //首先遍历链表,把其中结点的权值全部压入栈中
head=head->next;
}
while(!str.empty())
{
//因为要求用数组返回把栈中的所有元素全部尾插到数组中
arr.push_back(str.top());
//弹出栈中的元素,即表示逆序输出的结果
str.pop();
}
//最后返回数组的内容
return arr;
}
};
性能分析:
到此,关于本题的讲解便全部结束!!!