剑指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 ...
随机推荐
- spineRunTime for cocos2dx v3 中动画播完删除animation
spineRunTime for cocos2dx v3 中删除animation,发现下面写法会崩溃: spine::SkeletonAnimation* animationNode = spi ...
- GOKit全缓动类型gif列表
1.Linear 2.BackIn 3.BackInOut 4.BackOut 5.BounceIn 6.BounceInOut 7.BounceOut 8.CircIn 9.CircInOut 10 ...
- .NET Remoting中的通道注册
今天我的同事使用Remoting注册一个新通道.奇怪的是,通道始终无法注册,总是报告异常“该通道已被占用”.我明白这个异常出现的原因,但不明白的是此时系统并未使用任何一个通道,为何会有这个异常呢?即使 ...
- 关于locate这个NB命令我不得不深入的学习
先看看locate的安装包和生成的文件: [root@NB mlocate]# which locate /usr/bin/locate [root@NB mlocate]# rpm -qf /usr ...
- jQuery.extend()中的布尔值的作用
jQuery.extend()中,第一个参数可以添加一个布尔值,表示是否深层拷贝,默认是false.但如果设置为true,则表示深层拷贝. 下面来看看什么是深层拷贝: <script type= ...
- 中间件监控之tomcat
中间件主要目的:能够支持更多人去访问 一.Tomcat 介绍 Tomcat 是一个小型的轻量级应用服务器,当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP页面和Serv ...
- json格式详解
一.Json的简单介绍 从结构上看,所有的数据最终都可以分成三种类型: 第一种类型是scalar(标准变量),也就是一个单独的string(字符串)或数字(numbers),比如“北京”这个单独的 ...
- dubbox2.8.4例子教程二
简介 上篇博客写了个dubbox生产者,也用HttpClient代码测试了rest服务,下面记录dubbox消费者工程 一.工程结构 一.Simple.java package bhz.ent ...
- springMVC demo搭建
1.使用idea新建一个基于maven的web项目,参考 http://www.cnblogs.com/winkey4986/p/5279820.html 2.采取了比较偷懒的配置方法,只配置了一个D ...
- Android——String.IndexOf 方法 (value, [startIndex], [count])
报告指定字符在此实例中的第一个匹配项的索引.搜索从指定字符位置开始,并检查指定数量的字符位置. 参数 value 要查找的 Unicode 字符. 对 value 的搜索区分大小写. startI ...