剑指Offer面试题:4.从尾到头打印链表
一、题目:从尾到头打印链表
题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值。

到解决这个问题肯定要遍历链表。遍历的顺序是从头到尾的顺序,可输出的顺序却是从尾到头。也就是说第一个遍历到的结点最后一个输出,而最后一个遍历到的结点第一个输出。这就是典型的“后进先出”,我们可以用栈实现这种顺序。
二、解题思路

每经过一个结点的时候,把该结点放到一个栈中。当遍历完整个链表后,再从栈顶开始逐个输出结点的值,此时输出的结点的顺序已经反转过来了。
三、解决问题
3.1 代码实现
这里使用的是自定义实现的链表类,其节点定义如下:
public class Node<T>
{
// 数据域
public T Item { get; set; }
// 指针域
public Node<T> Next { get; set; } public Node()
{
} public Node(T item)
{
this.Item = item;
}
}
这里的自定义的单链表的实现请参考:《数据结构基础温故-1.线性表(中)》
(1)基于栈的循环版本
public static void PrintListReversinglyIteratively(Node<int> head)
{
Stack<Node<int>> stackNodes = new Stack<Node<int>>();
Node<int> node = head;
// 单链表元素依次入栈
while (node != null)
{
stackNodes.Push(node);
node = node.Next;
}
// 栈中的单链表元素依次出栈
while (stackNodes.Count > )
{
Node<int> top = stackNodes.Pop();
Console.Write("{0}", top.Item);
}
}
(2)递归版本
public static void PrintListReversinglyRecursively(Node<int> head)
{
if (head != null)
{
if (head.Next != null)
{
PrintListReversinglyRecursively(head.Next);
} Console.Write("{0}", head.Item);
}
}
两个版本的对比:上面的基于递归的代码看起来很简洁,但有个问题:当链表非常长的时候,就会导致函数调用的层级很深,从而有可能导致函数调用栈溢出。显式用栈基于循环实现的代码的鲁棒性要好一些。
3.2 单元测试
(1)单元测试主入口
// 测试主入口
static void PrintTestPortal(Node<int> head)
{
Console.WriteLine("-------Begin--------");
NormalPrint(head);
Console.WriteLine();
PrintListReversinglyIteratively(head);
Console.WriteLine();
PrintListReversinglyRecursively(head);
Console.WriteLine("\n-------End--------");
}
// 辅助方法:正序打印链表
static void NormalPrint(Node<int> head)
{
Node<int> temp = head;
while(temp != null)
{
Console.Write("{0}",temp.Item);
temp = temp.Next;
}
}
在测试入口中,我们首先正序打印链表,然后使用循环版从尾到头打印链表,最后使用递归版从尾到头打印链表。
(2)正常的多元素链表
// 1->2->3->4->5
static void PrintTest1()
{
Console.WriteLine("TestCase1:");
SingleLinkedList<int> linkedList = new SingleLinkedList<int>();
linkedList.Add();
linkedList.Add();
linkedList.Add();
linkedList.Add();
linkedList.Add(); PrintTestPortal(linkedList.Head);
}
(3)只有一个节点的链表
// 只有一个节点的链表
static void PrintTest2()
{
Console.WriteLine("TestCase2:");
SingleLinkedList<int> linkedList = new SingleLinkedList<int>();
linkedList.Add(); PrintTestPortal(linkedList.Head);
}
(4)鲁棒性测试:NULL
// 空链表
static void PrintTest3()
{
Console.WriteLine("TestCase3:"); PrintTestPortal(null);
}
测试结果如下图所示:

剑指Offer面试题:4.从尾到头打印链表的更多相关文章
- 剑指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第二版-6.从尾到头打印链表
描述:输入一个链表的头节点,从尾到头打印每个节点的值. 思路:从尾到头打印,即为“先进后出”,则可以使用栈来处理:考虑递归的本质也是一个栈结构,可递归输出. 考点:对链表.栈.递归的理解. packa ...
- 【剑指Offer】3、从尾到头打印链表
题目描述: 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 解题思路: (三种方法:借助栈.递归.列表的首位插入) 从头到尾打印链表比较简单,从尾到头很自然的可以 ...
- 剑指Offer编程题3——从尾到头打印链表
题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 题目解析 方法1:建立两个vector,第一个用来存储正向访问的数据,第二个用来反向存储. /** * struct L ...
- 剑指offer_面试题5_从尾到头打印链表(栈和递归实现)
题目:输入一个链表的头结点,从尾到头反过来打印出每一个节点的值 考察 单链表操作.栈.递归等概念. 理解:要实现单链表的输出,那么就须要遍历.遍历的顺序是从头到尾.而节点输出的顺序是从尾到头.因此,先 ...
- 剑指offer(5)——从尾到头打印链表
题目: 输入一个链表的头结点,从尾到头反过来打印出每个结点的值.结点定义如下: public class ListNode { int val; ListNode next = null; ListN ...
- 剑指Offer_编程题之从尾到头打印链表
题目描述 输入一个链表,从尾到头打印链表每个节点的值.
随机推荐
- 手机端页面rem自适应脚本
什么是rem 参照 web app变革之rem 在我看来,rem就是1rem单位就等于html节点fontsize的像素值.所以改变html节点的fontsize是最为关键的一步.根据手机宽度改变相对 ...
- 【leetcode】Largest Number
题目简述: Given a list of non negative integers, arrange them such that they form the largest number. Fo ...
- .NET Remoting 应用实例
前言 项目中运用到.NET Remoting ,前段时间也看了下.NET Remoting的相关资料,感觉自己应该动手写个实例来梳理下对.NET Remoting认识和理解,不足的地方请大家指正. 简 ...
- Android传递数据5种方法
Android开发中,在不同模块(如Activity)间经常会有各种各样的数据需要相互传递,我把常用的几种 方法都收集到了一起.它们各有利弊,有各自的应用场景. 我现在把它们集中到一个例子中展示 ...
- [原创] Go语言在Centos上的部署
序言 Golang是个好东西啊.部署非常简单,对于运维人员来说太爽了. 传统的Nginx啊Apache啊,外加PHP以及各个插件啊搞得头晕. 用了Go之后就什么都不需要了.只要把生成好的文件向服务器上 ...
- maven打包时,依赖包打不进jar包中
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- 微服务中的netty
一般使用netty主要是整个netty流程的理解,实际开发中服务端.客户端参数的配置,以及连接 handle的管理是关键,再有就是encode和decode编码.解码. 服务端流程图 客户端流程图包含 ...
- 运行时使用Dev的ImageListEditor
uses cxImageListEditor, cxGridMenuOperations; {$R *.dfm} procedure TForm1.Btn1Click(Sender: TObject) ...
- Ice-E(Embedded Internet Communications Engine)移植到s3c2440A(arm9)linux(2.6.12)上的
2009-03-26 18:31:31 原文链接 1.前言 ICE-E是ICE在嵌入式上运行的一个版本,与ICE比较如下: Category Ice 3.3.0 Ice-E 1.3.0 Thread ...
- 复利计算器(软件工程)及Junit测试———郭志豪
计算:1.本金为100万,利率或者投资回报率为3%,投资年限为30年,那么,30年后所获得的利息收入:按复利计算公式来计算就是:1,000,000×(1+3%)^30 客户提出: 2.如果按照单利计算 ...