c++ vector 反转打印链表

来源:互联网 发布:百度 mac 五笔 词库 编辑:程序博客网 时间:2024/06/08 13:35

题目描述

输入一个链表,从尾到头打印链表每个节点的值。

要求接口为:  vector<int> printListFromTailToHead(ListNode* head);

解析:

遍历链表,但遍历的顺序是从头到尾,可输出是从尾到头,明显是要进行转换

方法一:利用vector的reverse函数

/**  struct ListNode {*        int val;*        struct ListNode *next;*        ListNode(int x) :*              val(x), next(NULL) {*        }*  };*/class Solution {public:    vector<int> printListFromTailToHead(ListNode* head) {        vector<int> result;    struct ListNode * pNode = head;                while(pNode != NULL)        {            result.push_back(pNode->val);            pNode = pNode->next;        }                reverse(result.begin(), result.end());                return result;    }};
方法二:先将链表反转,在放入容器输入

不用递归实现

/***  struct ListNode {*        int val;*        struct ListNode *next;*        ListNode(int x) :*              val(x), next(NULL) {*        }*  };*/class Solution {public:    vector<int> printListFromTailToHead(ListNode* head) {        vector<int> result;    struct ListNode *lpre = head;        struct ListNode *lcur = lpre->next;        struct ListNode *lnext = NULL;                while(lcur != NULL)        {            lnext = lcur->next;            lcur->next = lpre;            lpre = lcur;            lcur = lnext;                    }           head->next = NULL;                while(lpre != NULL)        {            result.push_back(lpre->val);            lpre = lpre->next;        }        return result;    }};
用递归实现链表反转,这个不好用在完成这个接口上

void printListFromTailToHead(ListNode* pListHead){     if(pListHead!=NULL){                //print the next node first        if(pListHead->next!=NULL){             printListFromTailToHead(pListHead->next);             }         // And then print the current node         print("%d",pListHead->val);     } }
方法三:vector和stack共同完成

后入先出很容易想到栈吧

class Solution {public:    vector<int> printListFromTailToHead(ListNode* head) {        vector<int> result;    stack<struct ListNode*>Nodes;        struct ListNode* pNode = head;                while(pNode != NULL)        {            Nodes.push(pNode);            pNode = pNode->next;        }                while(!Nodes.empty())        {            pNode = Nodes.top();            result.push_back(pNode->val);            Nodes.pop();        }        return result;    }};