剑指offer3:从尾到头打印链表每个节点的值
1. 题目描述
输入一个链表,从尾到头打印链表每个节点的值。
2. 思路和方法
2.1 推荐的方法
(1)栈,循环
后进先出,我们可以用栈实现这种顺序。每经过一个结点的时候,把该节点放到一个栈里面,当遍历完整个链表后,再从栈顶开始逐个输出结点的值,此时输出的结点的顺序已经反转过来了。
2.2 不推荐的方法
(1)直接修改输入数据
如果可以修改原来链表的结构,那么把链表中链接结点的指针反转过来,改变链表的方向,然后就可以从头到尾输出了。
但是,打印通常是一个只读操作,我们不希望打印时修改内容,所以就得想别的办法。
(2)递归
递归在本质上就是一个栈结构,于是很自然地又想到了用递归来实现。每访问到一个结点的时候,先递归输出它后面的节点,再输出该节点自身,这样链表的输出结果就反过来了。
3. 核心代码
class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> result;
stack<int> nodes;
ListNode* pNode = head;
while (pNode != NULL){
nodes.push(pNode->val);
pNode = pNode->next;
}
while (!nodes.empty()){
result.push_back(nodes.top());
nodes.pop();
}
return result;
}
};
4. C++完整测试
#include<iostream>
#include<string>
#include <vector>
#include<stack> using namespace std; struct ListNode
{
char val;
ListNode* next;
}; void createlist(ListNode *&head)
{
ListNode *p = head;
while ()
{
char s;
cin >> s;
if (s != '#')
{
ListNode *newnode = new ListNode;
newnode->val = s;
newnode->next = NULL;
if (head == NULL)
{
head = newnode;
p = head;
}
else
{
p->next = newnode;//往p后面添加新节点
p = newnode;//最后一个节点变成新节点
}
}
else
{
break;
}
}
} class Solution {
public:
vector<int> printListFromTailToHead(ListNode* head) {
vector<int> result;
stack<int> nodes; ListNode* pNode = head;
while (pNode != NULL){
nodes.push(pNode->val);
pNode = pNode->next;
}
while (!nodes.empty()){
result.push_back(nodes.top()); // pop是弹出栈顶元素,top是获得栈顶元素,不弹出
nodes.pop();
}
return result;
}
}; int main()
{
Solution a;
ListNode *head = NULL;
createlist(head);
cout << "---------打印原始字符串序列!----------" << endl;
ListNode * p = head;
while (p != NULL)
{
// if (p == head)
// cout << p->val;
// else
// cout << " " << p->val;
cout << p->val;
p = p->next;
}
cout << endl;
cout << "--------打印原始字符串序列!----------" << endl; cout << "--------逆序打印----------" << endl;
vector<int> res;
res = a.printListFromTailToHead(head); //输出全部元素
vector<int>::iterator it;
for (it = res.begin(); it != res.end(); it++)
{
cout << (char)*it << " "; //vector int 转换为 char类型
}
cout << endl;
system("pause");
return ;
}
参考资料
https://blog.csdn.net/u011475210/article/details/78106191
https://blog.csdn.net/u011275956/article/details/51321028
https://blog.csdn.net/slandarer/article/details/91863177(链表详解)
剑指offer3:从尾到头打印链表每个节点的值的更多相关文章
- 剑指Offer-3.从尾到头打印链表(C++/Java)
题目: 输入一个链表,按链表从尾到头的顺序返回一个ArrayList. 分析: 很简单的一道题,其实也就是从尾到头打印链表,题目要求返回ArrayList,其实也就是一个数组. 可以将链表中的元素全部 ...
- 剑指Offer 从尾到头打印链表
题目描述 输入一个链表,从尾到头打印链表每个节点的值. 输入描述: 输入为链表的表头 输出描述: 输出为需要打印的“新链表”的表头 思路: 用容器vector,递归到最后一个元素,push_back到 ...
- 剑指offer——从尾到头打印链表节点的值
输入一个链表,从尾到头打印链表每个节点的值. 输入描述:输入为链表的表头 输出描述:输出为需要打印的“新链表”的表头 一.问题分析 初拿到这个题目时,这应该是考察单向链表这一数据结构.单向链表的遍历总 ...
- 剑指Offer——从尾到头打印链表
题目描述: 输入一个链表,从尾到头打印链表每个节点的值. 分析: 方法1:利用栈的性质,先从头到尾遍历链表每个节点的值存入栈中,最后一个一个出栈顺序便是从尾到头的. 方法2:直接从头到尾遍历链表存储节 ...
- 剑指offer —— 从尾到头打印链表
1.问题:输入一个链表,从尾到头打印链表每个节点的值. /** * public class ListNode { * int val; * ListNode next = null; * * Lis ...
- (CSDN迁移) 输入一个链表,从尾到头打印链表每个节点的值
题目描述 输入一个链表,从尾到头打印链表每个节点的值. 思路1. 翻转链表,使用java自带的翻转函数或者从头到尾依次改变链表的节点指针 /** * public class ListNode { * ...
- 剑指Offer_6_从尾到头打印链表
题目描述 输入应该链表的头节点 , 从尾到头反过来打印出每个节点的值.链表定义如下 : typedef struct ListNode { int m_nKey ; ListNode * ...
- 剑指offer--18.从尾到头打印链表
递归,逐个加到后面 ------------------------------------------------------------------------------ 时间限制:1秒 空间限 ...
- 用js刷剑指offer(从尾到头打印链表)
题目描述 输入一个链表,按链表从尾到头的顺序返回一个ArrayList. 牛客网链接 js代码 /*function ListNode(x){ this.val = x; this.next = nu ...
随机推荐
- 在windows使用gvim的感受
用新下载的gvim写几行代码习惯一下,感觉vim用起来要比atom占用的内存少多了,更加的便捷.由于之前一直在用sublime text2,虽然我也很喜欢ST,但我还是抱着膜拜的心态来试了试gvim, ...
- Java线程之join
简述 Thread类的join方法用来使main线程进入阻塞状态,进而等待调用join方法的线程执行,join有三个重载方法: public final void join() 使主线程进入阻塞状态, ...
- 5.rabbitmq--通配符模式Topics
rabbitmq--通配符模式Topics topic模式也称为主题模式,其实他相对于routing模式最大的好处就是他多了一种匹配模式的路由,怎么理解匹配呢,其实就相当于我们之前正则的.*这种,不过 ...
- Linux设备驱动程序 之 原子操作
原子整数操作 当共享资源是一个简单的整数值时,可以使用内核提供的一种原子的整数类型,称为atomic_t,定义在<linux/types.h>中,操作定义在<linux/atomic ...
- JS高级_变量提升和函数提升
先执行变量提升,后执行函数提升 function a(){} var a console.log(typeof a)//function
- [Mysql]一对多关系是如何发挥作用的?
一个孩子只有一个妈妈,而一个妈妈可以有多个孩子,这是典型的一对多的关系,这里采用navicat图形化界面建立二者的关系. 第一步:创建mother表,如下图: 第二步:创建children表,在ch ...
- Java商城秒杀系统的设计与实战视频教程(SpringBoot版)_汇总贴
51CTO学院 Java商城秒杀系统的设计与实战视频教程(SpringBoot版) H:\BaiDu\微服务0830\2019最新 Java商城秒杀系统的设计与实战视频教程(SpringBoot版) ...
- Spring+Ibatis开发
Spring+Ibatis开发:1.首先回忆Spring+Hibernate开发:那么时候我们是先加入的Spring,然后在加入Hibernate支持包的,而此时我们Spring+Ibatis开发,原 ...
- ubuntu14.04 安装 zoom.us
https://support.zoom.us/hc/en-us/articles/204206269-Getting-Started-on-Linux http://askubuntu.com/qu ...
- Pandas导入导出&pickle文件模块
Pandas可以读取与存储的文件格式有很多 像csv,excel,json,html等,详细请看官方文档https://pandas.pydata.org/pandas-docs/stable/use ...
