剑指offer_面试题5_从尾到头打印链表(栈和递归实现)
题目:输入一个链表的头结点,从尾到头反过来打印出每一个节点的值
考察 单链表操作、栈、递归等概念。
理解:要实现单链表的输出,那么就须要遍历。遍历的顺序是从头到尾。而节点输出的顺序是从尾到头。因此,先遍历到的节点后输出。这是一个典型的 “后进先出”。
要实现这种输出,能够使用栈,或,递归。
通过这道题,让我对 “递归在本质上就是一个栈结构” 理解的更加深刻。
代码例如以下:
/************************************************************************/
/** 题目:输入一个链表的头结点。从尾到头反过来打印出每一个节点的值 */
/** 时间:2015.7.24 作者:jwt */
/************************************************************************/ #include <iostream>
#include <stack> using namespace std; typedef struct node{
int value;
struct node *next;
}Listnode; /**创建一个单链表,n:表示节点数*/
Listnode * Create_List(int n)
{
int i = 0, elem;
Listnode *head, *temp, *curr;
head = new Listnode;
head->next = NULL;
head->value = n; /**头结点保存数据节点个数*/
curr = head; while(i < n) /*尾插法,新节点都放在最后*/
{
cout << "please input an elem: " << endl;
cin >> elem;
temp = new Listnode;
temp->value = elem;
temp->next = NULL; curr->next = temp;
curr = temp;
i++;
}
return head;
} /**栈实现反向输出单链表*/
void Print_List_Reverse_with_stack(Listnode *head)
{
Listnode *p;
stack<int> temp;
if(NULL == head) /*头结点为空,那么这个链表就不存在*/
return;
else{ /*链表的第一个数据节点是头节点的下一个节点。因此链表为空,就是第一个数据节点为空*/
p = head->next;
if(NULL == p)
{
cout << "该链表为空" << endl;
return;
}
}
do{
temp.push(p->value); /*遍历到的节点数据依次入栈*/
p = p->next;
}while(NULL != p); while(!temp.empty())
{
cout << temp.top() << ' '; /*输出栈顶元素*/
temp.pop(); /*栈顶元素出栈*/
}
cout << endl;
} /**递归实现反向输出单链表*/
void Print(Listnode *head) /*递归函数*/
{
if(NULL != head)
{
if(NULL != head->next)
{
Print(head->next);
}
cout << head->value << ' ';
}
}
void Print_List_Reverse_Recursively(Listnode *head) /**加这一步的原因是防止输出头结点*/
{
if(NULL == head)
return;
Listnode *p;
p = head->next;
if(NULL == p)
{
cout << "链表为空" << endl;
return;
}
else{
Print(p);
}
} int main()
{
Listnode *test;
test = Create_List(5);
Print_List_Reverse_with_stack(test);
Print_List_Reverse_Recursively(test);
return 0;
}
结果例如以下:
/*点滴积累,我的一小步O(∩_∩)O~*/
剑指offer_面试题5_从尾到头打印链表(栈和递归实现)的更多相关文章
- 剑指Offer_编程题之从尾到头打印链表
题目描述 输入一个链表,从尾到头打印链表每个节点的值.
- 剑指Offer - 九度1511 - 从尾到头打印链表
剑指Offer - 九度1511 - 从尾到头打印链表2013-11-29 21:08 题目描述: 输入一个链表,从尾到头打印链表每个节点的值. 输入: 每个输入文件仅包含一组测试样例.每一组测试案例 ...
- JS 剑指Offer(四) 从尾到头打印链表
题目:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 首先定义一下链表中的节点,关于链表这个数据结构在另外一篇文章中会详细讲 function ListNode(val) { t ...
- 剑指offer【03】- 从尾到头打印链表(4种实现方法)
题目:从尾到头打印链表 考点:链表 题目描述:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 法一:ArrayList头插法 /** * public class ListNode ...
- 剑指offer(3)从尾到头打印链表
题目描述 输入一个链表,从尾到头打印链表每个节点的值. 题目分析 比较简单,主要注意下从尾到头,可以用栈可以用递归,我给出我比较喜欢的代码吧 代码 /* function ListNode(x){ t ...
- 【剑指Offer】3、从尾到头打印链表
题目描述: 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 解题思路: (三种方法:借助栈.递归.列表的首位插入) 从头到尾打印链表比较简单,从尾到头很自然的可以 ...
- 剑指offer第二版-6.从尾到头打印链表
描述:输入一个链表的头节点,从尾到头打印每个节点的值. 思路:从尾到头打印,即为“先进后出”,则可以使用栈来处理:考虑递归的本质也是一个栈结构,可递归输出. 考点:对链表.栈.递归的理解. packa ...
- 剑指Offer编程题3——从尾到头打印链表
题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 题目解析 方法1:建立两个vector,第一个用来存储正向访问的数据,第二个用来反向存储. /** * struct L ...
- 剑指offer(5)——从尾到头打印链表
题目: 输入一个链表的头结点,从尾到头反过来打印出每个结点的值.结点定义如下: public class ListNode { int val; ListNode next = null; ListN ...
随机推荐
- Spring aop与AspectJ的区别?
根据我看spring官方文档的理解(不出意外是最正确的答案): ①选择spring的AOP还是AspectJ? spring确实有自己的AOP.功能已经基本够用了,除非你的要在接口上动态代理或者方法拦 ...
- 【Android】20.1 音频播放
分类:C#.Android.VS2015: 创建日期:2016-03-11 一.简介 MediaPlayer:适合每次播放一个音频资源或者音频文件的场合. SoundPool:适合同时播放多个音频资源 ...
- linux 日志定时轮询流程详解(logrotate)
logrotate介绍 对于Linux系统安全来说,日志文件是极其重要的工具.日志文件包含了关于系统中发生的事件的有用信息,在排障过程中或者系统性能分析时经常被用到.当日志文件不断增长的时候,就需要定 ...
- python——内置函数和lambda匿名函数
内置函数 接下来,我们就一起来看看python里的内置函数.截止到python版本3.6.2,现在python一共为我们提供了68个内置函数.它们就是python提供给你直接可以拿来使用的所有函数.这 ...
- nrm 的使用
我们介绍过cnpmjs.org和淘宝 npm 两个 NPM 镜像.除此之外,还有一些国外的 NPM 镜像.不同地区访问不同的镜像速度可能有差异,因此有时候需要切换 NPM 镜像.相比每次切换时都手动指 ...
- webpack vue2.0项目配置文件详解
const path = require('path') const webpack = require('webpack') const HtmlWebpackPlugin = require('h ...
- mvn项目中的pom文件提示Error parsing lifecycle processing instructions解决
清空.m2/repository下的所有依赖文件,重新下载即可解决该问题. 如果本地用户下没有.m2/repository 目录,找到如下mvn 指定的repository,进去之后清空所有文件.
- LeetCode: Multiply Strings 解题报告
Multiply StringsGiven two numbers represented as strings, return multiplication of the numbers as a ...
- java 多线程5: java 终止线程及中断机制 (stop()、interrupt() 、interrupted()、isInterrupted())
JAVA中有3种方式可以终止正在运行的线程 ①线程正常退出,即run()方法执行完毕了 ②使用Thread类中的stop()方法强行终止线程.但stop()方法已经过期了,不推荐使用 ③使用中断机制i ...
- windows下PIP安装模块编码错误解决
原因是pip安装Python包会加载我的用户目录,我的用户目录恰好是中文的,ascii不能编码.解决办法是: python目录 Python27\Lib\site-packages 建一个文件site ...