剑指Offer:从尾到头打印链表
剑指Offer:从尾到头打印链表
问题描述:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)
解题思路:
- 要求用数组(vector)返回,vector只能进行尾插法,无法实现逆序;
- 用容器deque,可进行
头尾
插入删除,遍历链表val值,全部通过头插法加入该容器; - 再遍历deque容器(从头到尾已实现逆序),从头传入val值到vector当中,再弹出deque的头部val值。
注意:
- 这样不可避免需要创建两个容器,并重复插入删除容器,时间消耗可能有点大。
- 有个比较好的reverse函数,能够成功将数组,字符串,容器等进行反转。具体代码看如下。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
vector<int> reversePrint(ListNode* head)
{
std::deque<int> d_data; //通过reverse函数,也可不用
std::vector<int> arr;
while(head != NULL)
{
d_data.push_front(head->val);
head=head->next;
}
//for循环可省去
for(auto i:d_data)
{
arr.push_back(d_data.front());
d_data.pop_front();
}
//reverse(arr.begin(),arr.end()); //省去for循环,可节省很多时间和内存
return arr;
}
};
通过reverse函数,时间效率能提高很多。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
vector<int> reversePrint(ListNode* head)
{
std::vector<int> arr;
while(head != NULL)
{
arr.push_back(head->val);
head=head->next;
}
reverse(arr.begin(),arr.end()); //省去for循环,可节省很多时间和内存
return arr;
}
};