文章目录
前言
提示:本系列所有相关代码都以C++为编程语言进行讲解。且格式采用牛客网的给定格式。
本文是作者在牛客网上刷剑指offer题目之后,发现即使是一道简单题也仍有许多很好的解题思路,看完之后深感自己的的不足,故在此写下题目中的各个解法及思路,方便日后回顾总结,如果错漏或者概念混淆之处,烦请各位看官不吝赐教,多加指正。
题目
输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。
如输入{1,2,3}的链表如下图:
返回一个数组为[3,2,1]
0 <= 链表长度 <= 10000
一、遍历链表,依次赋值给新建的数组中,遍历结束后,将数组翻转
创建一个数组,依次对链表进行遍历,并赋值给数组,后用reverse()函数实现数组翻转。
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) :
* val(x), next(NULL) {
* }
* };
*/
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> A;
//依次将链表内容赋值给数组
while(head)
{
A.push_back(head->val);
head = head->next;
}
//翻转,reverse()函数的两个参数分别是要翻转的起点和终点
reverse(A.begin(), A.end());
return A;
}
};
二、使用类似头插法的方式遍历链表,得到一个顺序翻转的链表,然后依次赋值给数组
本方法需要用到三个指针:head,fro,tail
从第二个链表节点开始,依次将节点使用头插法,插入到链表的首部,直到全部遍历完成。最终得到一个翻转的链表。
那么代码如下:
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> A;
//判断是否空链表
if(!head)
{
return A;
}
ListNode* fro,* tail;
fro = head;
//判断链表只有一个结点的情况
if(head->next)
{
tail = head->next;
}
else
{
A.push_back(head->val);
return A;
}
//头插法实现
while(fro->next)
{
fro->next = tail->next;
tail->next = head;
head = tail;
tail = fro->next;
}
while(head)
{
A.push_back(head->val);
head = head->next;
}
return A;
}
};
三、使用递归的方法
可以使用递归的方法进行求解
递归方式有两种,一种是在函数外定义一个全局变量的数组,一种是在函数内定义局部变量数组,后者占的内存更大,推荐前者。
定义全局变量递归的代码如下:
class Solution {
public:
vector<int> A;//定义函数外的全局变量
vector<int> printListFromTailToHead(ListNode* head) {
if(!head) return A;//判断是否为空函数
if(head->next)
{
//进行递归
printListFromTailToHead(head->next);
}
//递归结束后依次从后向前返回val值,并赋值给数组
A.push_back(head->val);
return A;
}
};
定义局部变量递归的代码如下:
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> A;//定义函数内的局部变量
if(!head) return A;
if(head->next)
{
//进行遍历并将遍历返回的数组赋值给上一层的数组
A = printListFromTailToHead(head->next);
}
//将本层数值push进数组中
A.push_back(head->val);
return A;
}
};
四、利用栈的先进后出特性,实现链表元素的从尾到头输出
通过stack(栈)容器,依次遍历链表并入栈,直到遍历结束,之后依次出栈并赋值给数组
代码如下:
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
stack<int> buf;
vector<int> A;
while(head)
{
buf.push(head->val);
head = head->next;
}
while(!buf.empty())
{
A.push_back(buf.top());
buf.pop();
}
return A;
}
};