剑指offer第5题——>从尾到头逆序打印单链表
来源:互联网 发布:传奇盛世翅膀8升9数据 编辑:程序博客网 时间:2024/04/27 22:44
从尾到头打印单链表
题目:输入一个链表的头结点,从尾到头反过来打印出每个节点的值
根据题目,我们知道这是一个带有头结点的单链表对吧,那么我们首先就可以定义一个结构体用来描述这个节点:
struct ListNode {int val;struct ListNode *next;ListNode(int x):val(x), next(NULL) {}};下面我呢介绍两种方法解决这个问题
1、递归方法
我们知道,正常来说,有头结点的话,我们直接从头结点遍历去打印就行了,但是呢我们现在是需要逆序打印,所以我们一定需要先到尾节点再打印。
其次,我们知道如果这是一个双向链表,带有prev这个指向前一个节点的指针,那么也可以根据头结点很方便的去打印,直接从头结点开始不断指向前一个节点就好了。
但是,我们现在没有prev这个指针,如果要逆序打印就必须先到最后的尾节点。所以,我们可以用递归的方式去走到最后一个节点,然后再去打印。
下面呢我们通过代码来解释:
void PrintListFromTailToHead_R(ListNode* head){if (head){if (head->next)PrintListFromTailToHead_R(head->next);cout << head->val << " ";}}首先,我们判断头结点是否为空,如果为空,那么可以直接退出了,毕竟这个链表就是空的。
如果链表不为空,那么我们呢就需要去判断从头结点开始的下一个节点是否为空,如果不为空,那么就递归走下去,如果为空了,那么就打印,并且往后退,直到退出递归。
下面呢我用图片仔细演示一下递归的过程:
2、利用栈的方法
这一种不利用递归的方式其实很多人都很熟悉,那就是去利用栈的特性。栈是先进后出的特性,所以你只需要不断地往栈里面压入数据,那么第一个进去的数据肯定是最后一个出栈,那么就可以模拟实现递归的效果了。在所有数据都压入栈之后,我们再去选择打印,当栈不为空时,打印栈顶的数据,然后把栈顶元素删掉,这样就可以调到下一个元素了。
代码:
void PrintListFromTailToHead_Stack(ListNode* head){stack<int> s;ListNode* cur = head;while (cur){s.push(cur->val);cur = cur->next;}while (!s.empty()){cout << s.top() << " ";s.pop();}}
注:在VS2013编译器下实现的代码
阅读全文
0 0
- 剑指offer第5题——>从尾到头逆序打印单链表
- 【剑指offer】从尾到头打印单链表
- 【剑指offer】从尾到头打印单链表
- 剑指offer:第5题从尾到头打印链表
- 剑指Offer—— 题5 从尾到头打印链表 Java版
- 剑指offer 5---从尾到头打印单链表
- 《剑指offer》——从尾到头打印链表
- 《剑指offer》——从尾到头打印链表
- 《剑指offer》——从尾到头打印链表
- 剑指offer——从尾到头打印链表
- 从尾到头打印链表——剑指offer
- 剑指offer——从尾到头打印链表
- 剑指offer——从尾到头打印链表
- 剑指offer——从尾到头打印链表
- 《剑指offer》—3、从尾到头打印链表
- 剑指offer(3)—从尾到头打印链表
- 从尾到头打印链表 (剑指Offer 第 3 题)
- 【剑指offer】2.3.3链表——面试题5:从尾到头打印链表
- 甲骨文华育兴业-青柠成长计划
- 企业为什么要做渗透测试?从渗透内容看企业做渗透测试的重要性
- VLC框架分析
- C#异常处理
- 深入浅出理解SOA技术
- 剑指offer第5题——>从尾到头逆序打印单链表
- 易百教程
- ContentResolver和MediaStore介绍
- 极光推送
- Promise是Monad吗?
- 复习UITableViewCell
- codeforces 817D Imbalanced Array(单调栈)
- AttributeError: module 'tensorflow.python.ops.nn' has no attribute 'legacy_seq2s eq'
- JDK8新特性☞Function测试