【剑指offer】-从尾到头打印链表

来源:互联网 发布:电子打鼓软件下载 编辑:程序博客网 时间:2024/05/21 11:25

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

解析:这道题目可以有很多种解法,下面介绍几种自己的解法。

1)利用栈的特性来做,把链表结点依次压入栈,再依次打印出来即可。

2)利用递归来做。

3)把链表反转,再从头到尾打印。

4)利用STL中的vector来做,把链表结点全部存入到vector中,再从后往前打印一遍vector中的数据。

需要注意的是,第一种方法和第四种方法需要申请额外的内存空间,第三种方法会破坏链表的结构。可以在实际解题过程中,根据题目的要求来选择解法。个人比较推荐的是用栈或者递归来做,以下给出这两种方法的代码。

代码:

1)利用栈来做

/***  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;        if(head==NULL)            return result;        stack<ListNode *> nodes;        ListNode *temp=head;        while(temp!=NULL)            {            nodes.push(temp);            temp=temp->next;        }        while(!nodes.empty())            {            temp=nodes.top();            result.push_back(temp->val);            nodes.pop();        }        return result;    }};
2)利用递归来做

/***  struct ListNode {*        int val;*        struct ListNode *next;*        ListNode(int x) :*              val(x), next(NULL) {*        }*  };*/class Solution {public:    void print(ListNode* head,vector<int> &result)    {        if(head==NULL)            return;        print(head->next,result);        result.push_back(head->val);    }    vector<int> printListFromTailToHead(struct ListNode* head) {        vector<int> result;        print(head,result);        return result;    }};

1 0
原创粉丝点击