【剑指Offer】【链表】4_从尾到头反转链表

题目:从尾到头反转链表。输入一个链表,按链表从尾到头的顺序返回一个ArrayList。

 

A1:将链表反转,再从头到尾输出到vector中。 ====> 改变链表的结构

A2:从头到尾输出链表到vector中,在将vector反抓(反向迭代器)

A3:反向输出是一个先进后出的概念,所以可以用来实现这个顺序。

  把链表的节点逐个压栈,入栈结束后,链头就在栈底,链尾就在栈头,然后顺序出栈即可。  ====> 不会改变链表的结构

A4:递归在本质上也是一个栈结构。

  每访问到一个节点时,先滴回输出后面的节点,再输出节点本身。

 

//vector反向迭代器

class Solution {
public:
    vector<int> printListFromTailToHead(ListNode* head) {
        vector<int> ret;
        while(head != nullptr)
        {
            ret.push_back(head->val);
            head = head->next;
        }
        
        
        return vector<int>(ret.rbegin(), ret.rend());
    }
};

  

 

 

//栈

class Solution {
public:
    vector<int> printListFromTailToHead(ListNode* head) {
        stack<int> tmp;
        vector<int> ret;
        while(head != nullptr)
        {
            tmp.push(head->val);
            head = head->next;
        }
        while(!tmp.empty())
        {
            ret.push_back(tmp.top());
            tmp.pop();
        }
        return ret;
    }
};

 

//递归

class Solution {
public:
    vector<int> printListFromTailToHead(ListNode* head) {
        vector<int> ret;
        if(head == nullptr)
        {
            return ret;
        }
        ret = printListFromTailToHead(head->next);
        ret.push_back(head->val);
        return ret;
    }
};

 

 

 

相关题目:

  找出单向链表中的一个节点,该节点到尾指针的距离为K。链表的倒数第0个结点为链表的尾指针。要求时间复杂度为O(n)

  实现单链表的逆转函数,输入一个链表,反转链表后,返回翻转之后的链表。

  给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序。

 

posted @ 2019-08-25 16:31  XieXinBei0318  阅读(221)  评论(0编辑  收藏  举报