剑指offer3_从尾到头打印链表_题解
从尾到头打印链表
题目描述
输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
示例1
输入
{67,0,24,58}
返回值
[58,24,0,67]
分析
方案一:反转链表
设置pre节点指向正在反转节点的前一个节点,初始化为NULL
设置cur节点指向反转节点,cur初始化为head
设置next节点指向cur的下一个节点
代码
/**
复杂度分析
1.时间复杂度:O(n)
2.空间复杂度:O(1)
**/
class Solution
{
public:
vector<int> printListFromTailToHead(ListNode *head)
{
vector<int> ans;
ListNode *pre = NULL;
ListNode *cur = head;
while (cur != NULL)
{
ListNode *next = cur->next; //next指针指向cur的下一个节点
cur->next = pre; //反转
pre = cur; //pre右移
cur = next; //cur右移
}
// 遍历反转后的单链表,将元素保存到数组ans中
while (pre != NULL)
{
ans.push_back(pre->val);
pre = pre->next;
}
return ans;
}
};
方案二:使用reverse()函数
在遍历的过程中,把结点的值加入到vector中,然后使用reverse库函数反转vector
/**
复杂度分析
1.时间复杂度:O(n)
2.空间复杂度:O(n)
**/
class Solution
{
// reverse函数
vector<int> printListFromTailToHead(ListNode *head)
{
vector<int> ans;
// 从头到尾将结点的值加入ans
while (head != NULL)
{
ans.push_back(head->val);
head = head->next;
}
// 使用reverse库函数反转ans
reverse(ans.begin(), ans.end());
return ans;
}
};
方案三:递归版本
class Solution
{
public:
// 递归解法
vector<int> printListFromTailToHead(ListNode *head)
{
vector<int> ans;
if(head == NULL){
return ans;
}
ans = printListFromTailToHead(head->next);
ans.push_back(head->val);
return ans;
}
};