剑指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 ...
随机推荐
- 使用 bat cmd命令杀掉 删掉运行的程序
删掉所有xx.exe开启的进程 taskkill /f /im xx.exe 开启xx.exe start xx.exe 根据标题栏信息删除 taskkill /f /FI "windows ...
- Redis(二十):Redis数据过期和淘汰策略详解(转)
原文地址:https://yq.aliyun.com/articles/257459# 背景 Redis作为一个高性能的内存NoSQL数据库,其容量受到最大内存限制的限制. 用户在使用Redis时,除 ...
- Generics Variance
http://research.microsoft.com/pubs/64031/designandimplementationofgenerics.pdf Variance and Generali ...
- 每日英语:Why Are Fractions Key To Future Math Success?
Many students cruise along just fine in math until fourth grade or so. Then, they hit a wall -- frac ...
- dubbo服务端,dubbo客户端,注册中心(zk)之间的心跳
dubbo客户端和dubbo服务端之间存在心跳,由dubbo客户端主动发起,可参见dubbo源码 HeartbeatTask. dubbo服务端和注册中心(zk)存在心跳,由dubbo服务端发起,这是 ...
- 将struts的jar包拷贝到WEB-INF/lib导致eclipse中配置好的javadoc失效
我通过这个步骤导入了struts的jar包并且配置好了javadoc,且亲测可用: http://www.cnblogs.com/qrlozte/p/3173805.html 但是当我把struts的 ...
- 一款基于jquery的鼠标经过图片列表特效
今天要给大家推荐一款基于jquery的鼠标经过图片列表特效.当鼠标经过列表图片的时候,图片放大,且有一个半透明的遮罩层随之移动.效果图如下: 在线预览 源码下载 实现的代码 html代码: < ...
- git学习(三):git暂存区
回顾之前学过的命令: git init // 初始化一个项目 git add // 将文件交给工作区 git commit // 提交修改 查看提交日志: git log // 查看提交日志 git ...
- Fastjson 的简单使用<转>
简介 Fastjson是一个Java语言编写的高性能功能完善的JSON库. 高性能 fastjson采用独创的算法,将parse的速度提升到极致,超过所有json库,包括曾经号称最快的jackson. ...
- Android ListView 长按列表弹出菜单
Android ListView 长按列表弹出菜单 设置长按菜单 listView.setOnCreateContextMenuListener(new View.OnCreateContextMen ...