牛客网-剑指offer-从头到尾打印链表

来源:互联网 发布:iphone 网络电视 编辑:程序博客网 时间:2024/06/07 14:35

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

输入 – 链表的表头
输出 – 要打印的“新链表”的表头

描述:对于这种顺序颠倒的问题,一般会想到栈,先进后出。

———-方法一 : 通过借助容器vector和栈stack共同完成
解决这个问题肯定要遍历链表。遍历的顺序是从头到尾的顺序,可输出的顺序却是从尾到头。也就是说第一个遍历到的结点最后一个输出,而最后一个遍历到得结点第一个输出。这就是典型的“后进先出”,可以用栈实现这种顺序。每经过一个结点的时候,把该结点放到一个栈中。当遍历完整个链表后,再从栈顶开始逐个取出节点的值,放入vector容器中。

//链表结构体定义struct ListNode {        int val;        struct ListNode *next;        ListNode(int x) :              val(x), next(NULL) {        }};class Solution {public:    vector<int> printListFromTailToHead(struct 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;    }};

———-方法二:不使用容器vector,直接用print结合递归方式实现链表的反向打印
  递归在本质上就是一个栈结构,于是很自然地想到用递归来实现 要实现反过来输出链表每访问到一个结点的时候, 先递归输出它后面的结点,再输出该结点自身,这样链表的输出结构就反过来了。
 

struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {}};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);    }}

———-方法三:不使用栈结构stack,直接利用翻转函数reverse()函数和容器vector
每访问到一个结点的时候,取出节点的值放入容器中,最后使用翻转函数reverse()将容器翻转。

struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {}};class Solution{public:    vector<int> printListFromTailToHead(struct 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());//applying reverse()        return result;    }};
原创粉丝点击