剑指Offer:从尾到头打印链表

剑指Offer:从尾到头打印链表
问题描述:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)

解题思路:

  1. 要求用数组(vector)返回,vector只能进行尾插法,无法实现逆序;
  2. 用容器deque,可进行头尾插入删除,遍历链表val值,全部通过头插法加入该容器;
  3. 再遍历deque容器(从头到尾已实现逆序),从头传入val值到vector当中,再弹出deque的头部val值。

注意:

  1. 这样不可避免需要创建两个容器,并重复插入删除容器,时间消耗可能有点大。
  2. 有个比较好的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;
    }
};
posted @ 2020-02-16 21:23  Ternence_zq  阅读(97)  评论(0编辑  收藏  举报