链表面试题--从尾到头打印单链表

来源:互联网 发布:网络维护明细 编辑:程序博客网 时间:2024/06/10 22:24

题目:输入一个链表的头结点,从尾到头打印单链表
链表结点的定义:

struct LinkNode{ int val;ListNode *next;}

方法一:

//递归实现void PrintListTailToHead(struct ListNode *head){    if (head != NULL)    {        if (head->next != NULL)        {            PrintListTailToHead(head->next);        }        printf("%d\n", head->val);    }}

我们知道递归也是一种栈结构,通过分析子问题,找到递归出口,我们知道栈的特点是“后进先出”,我们每访问一个节点,先递归输出它的下一个节点,再输出该节点的本身,这样就可以从头到尾打印单链表;
但我们知道要不断的压栈和出栈,时间复杂度O(n^2);
方法二:
栈实现:
遍历的顺序是从头到尾,打印的顺序是从尾到头,也就是遍历的第一个节点最后输出,遍历的第一个节点最后输出,这是典型的后进先出,符合栈的结构;
利用栈的性质后进先出;把链表的节点顺序压栈,出栈自然就可以实现从尾到头打印了。
这里写图片描述
//栈实现

void PrintListTailToHead(struct ListNode *head){    stack<ListNode*> s;    ListNode*phead = head;    //压栈    while (phead != NULL)    {        s.push(phead);        phead = phead->next;    }    //出栈    while (!s.empty())    {        phead = s.top();        cout << phead->val << " ";        s.pop();    }    cout << endl;}

时间复杂度是O(N);
方法三:
利用反向迭代器

vector<int>PrintListTailToHead(struct ListNode *head){    vector<int> v;    if (head != NULL)    {        v.push_back(head->val);        head = head->next;    }    return vector<int>(v.rbegin(),v.rend());}

时间复杂度是O(N);
前年我们知道迭代器其实是一种智能指针,在list中相当于节点指针,在vector中其实是一种原生指针;通过运算符operator++,operator–,以及operator*和operator->来实现函数的功能;
迭代器的模拟实现:http://blog.csdn.net/f2016913/article/details/60780189

0 0