从尾到头打印链表

来源:互联网 发布:艺术网站源码 编辑:程序博客网 时间:2024/05/16 15:57

LeetCode第三题:从尾到头打印链表

LeetCode给的最初代码:

/***  struct ListNode {*        int val;*        struct ListNode *next;*        ListNode(int x) :*              val(x), next(NULL) {*        }*  };*/class Solution {public:    vector<int> printListFromTailToHead(ListNode* head) {    }};

法一:把链表的值复制到动态数组里,然后把数组反转顺序输出既可。

#include <iostream>#include <vector>#include <algorithm>using namespace std;struct ListNode{    int val;    ListNode *next;    ListNode(int x):val(x),next(NULL){    }   };//head链表无头结点 vector<int> PrintFromTailToHead(ListNode *head){    vector<int> a;    ListNode *p = head;     //定义一个p指针指向链表,用来遍历链表     while(p != NULL)        //遍历链表,把值存入数组c中     {        a.push_back(p->val);        p = p->next;    }    reverse(a.begin(),a.end());     //反转数组    return a; }//无头结点的链表的创建 void CreateListNode(ListNode **head){    int n;    cout<<"请输入链表的长度:";    scanf("%d",&n);    *head = NULL;//head不存储的时候,令他等于NULL,方便后面判断是不是第一个结点    ListNode *tail = *head;    //tail永远指向链表尾部    for(int i=0; i<n; i++)    {        int number;        printf("请输入第%d个数字:",i+1);        scanf("%d",&number);        ListNode *s = new ListNode(number);        //判断是不是第一个结点,若是直接赋值        if(tail == NULL)        {            *head = s;            tail = *head;           }        //不是头结点,直接用尾插法插入        else        {            tail->next = s;            tail = s;        }    }}int main(){    ListNode *L;    CreateListNode(&L);    vector<int> result = PrintFromTailToHead(L);    //打印vector数组    vector<int>::iterator it;    for(it = result.begin(); it != result.end(); it++)    {        cout << *it << endl;        }}

法二:从尾到头输出链表,可看成:“先进去的后输出,后进去的先输出”。和栈“先进后出”完全吻合。所以采用栈来存储链表中的结点值,全部接收完后,在逐个打印既可。

#include <iostream>#include <stack> #include <vector>#include <algorithm>using namespace std;struct ListNode{    int val;    ListNode *next;    ListNode(int x):val(x),next(NULL){    }   };//head链表无头结点 stack<int> PrintFromTailToHead(ListNode *head){    stack<int> a;    ListNode * tail = head;    while(tail!=NULL)    {        a.push(tail->val);        tail = tail->next;      }    return a;}//创建无头结点的链表 void CreateListNode(ListNode **head){    int n;    cout<<"请输入链表的长度:";    scanf("%d",&n);    *head = NULL;    ListNode *tail = *head;    for(int i=0; i<n; i++)    {        int number;        printf("请输入第%d个数字:",i+1);        scanf("%d",&number);        ListNode *s = new ListNode(number);        if(tail == NULL)        {            *head = s;            tail = *head;           }        else        {            tail->next = s;            tail = s;        }    }}int main(){    ListNode *L;    CreateListNode(&L);    stack<int> result = PrintFromTailToHead(L);    //栈的打印     while(!result.empty())    {        int nodes = result.top();        cout<< nodes <<endl;        result.pop();    }}
0 0
原创粉丝点击