“从尾到头打印链表”
作者:互联网
描述
输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。
如输入{1,2,3}的链表如下图:
返回一个数组为[3,2,1]
0 <= 链表长度 <= 10000
示例1
输入:{1,2,3}
返回值:[3,2,1]
示例2
输入:{67,0,24,58}
返回值:[58,24,0,67]
思路分析
解法一 直接遍历
-
题目很简单,很朴素。我们直接从这个链表的头节点开始进行遍历。然后我们记录下这个数组的每个节点的信息。最后反转一下整个数组,返回即可。
-
代码如下
- 需要直接遍历长度为n的链表的所有的结点,时间复杂度为O(n)
- 需要存储长度为n的链表的所有的结点,空间复杂度为O(n)
/**
* 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 == nullptr)
{
return res;
}
ListNode* cur = head;
//从头结点开始遍历
while(cur)
{
//将每个节点的值放入动态数组中
res.push_back(cur->val);
//指针向后移动
cur = cur->next;
}
//反转整个数组
reverse(res.begin(), res.end());
return res;
}
};
解法二 递归写法
-
由于这个题目需要我们从后面向前面开始打印这个数组。所以我们可以对遍历的结点进行一个递归,我们先递归到这个链表的最后面,然后不断向前收集权值。
-
代码如下
- 用DFS同样会遍历所有的结点,时间复杂度为O(n)
- 需要存储长度为n的链表的所有的结点,空间复杂度为O(n)
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) :
* val(x), next(NULL) {
* }
* };
*/
class Solution {
public:
vector<int> ans;
void dfs(ListNode* now){
// 递归的出口为当前的指针为空的情况
if(!now){
return;
}
// 向后面进行递归
dfs(now->next);
// 递归之后收集权值
ans.push_back(now->val);
}
vector<int> printListFromTailToHead(ListNode* head) {
dfs(head);
return ans;
}
};
标签:结点,ListNode,到头,val,res,next,链表,从尾 来源: https://blog.csdn.net/yizhizainulii/article/details/121969659