链表面试题--从尾到头打印单链表
来源:互联网 发布:网络维护明细 编辑:程序博客网 时间: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
- 链表面试题--从尾到头打印单链表
- 单链表面试题之从尾到头打印单链表
- 链表面试题--从尾到头打印单链表
- 面试题5:从尾到头打印链表
- 面试题4:从尾到头打印链表
- 【面试题五】从尾到头打印链表
- 面试题 -- 从尾到头 反向打印链表
- 面试题5 从尾到头打印链表
- 面试题5 从尾到头打印链表
- 面试题5:从尾到头打印链表
- 面试题5-从尾到头打印链表
- 面试题5:从尾到头打印链表
- 面试题—— 从尾到头打印链表
- 面试题五: 从尾到头打印链表
- 面试题5:从尾到头打印链表
- 《剑指Offer》面试题:从尾到头打印链表
- 面试题5:从尾到头打印链表
- 面试题6:从尾到头打印链表(offer)
- HDU1542 Atlantis 基于线段树的扫描线
- 猜算式
- Servlet过滤器
- centOS 6.5 mysql5.6忘记密码后重置密码
- 名企笔试:百度2015春季实习生(01排序) 2017-04-06 算法爱好者
- 链表面试题--从尾到头打印单链表
- 设计模式之单例模式
- 诡异代码-js-2
- POJ_2388_Who's in the Middle && 【快排,堆排实现】
- CodeForces 536A---Tavas and Karafs
- Palindrome Linked List
- select into语句之踩坑(一)报错
- css布局模型
- 5.4 判断两个字符串是否互为旋转词(find函数)