剑指offer-面试题5.从尾到头打印链表

2024-08-25 05:32

本文主要是介绍剑指offer-面试题5.从尾到头打印链表,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值。

 

 

刚看到这道题的小伙伴可能就会想,这还不简单,将链表反转输出。但是这种情况破坏了链表的结构。如果面试官要求不破坏链表结构呢,这时候我们就想到了一种数据结构---栈  当我们从前往后遍历链表逐个压栈 然后遍历结束后再逐个出栈。

 

首先我们先来用第一种方式实现:

复制代码
 1 #include <iostream>
 2 using namespace std;
 3 
 4 struct ListNode
 5 {
 6     int data;
 7     struct ListNode *next;
 8 };
 9 
10 struct ListNode* CreateList()
11 {
12     struct ListNode* Head,*p;
13     Head=(struct ListNode*)malloc(sizeof(ListNode));
14     Head->data=0;
15     Head->next=NULL;
16     p=Head;
17 
18     cout<<"Create List....(0-exit!)"<<endl;
19     while(true)
20     {
21         int Data;
22         cin>>Data;
23         if(Data!=0)
24         {
25             struct ListNode* NewNode;
26             NewNode=(struct ListNode*)malloc(sizeof(ListNode));
27             NewNode->data=Data;
28             NewNode->next=NULL;
29             p->next=NewNode;
30             p=p->next;
31         }
32         else
33         {
34             break;
35         }
36     }
37 
38     return Head->next;
39 }
40 
41 void PrintList(struct ListNode* Head)
42 {
43     cout<<"The List is: ";
44 
45     struct ListNode *p;
46     p=Head;
47     while(p!=NULL)
48     {
49         cout<<p->data<<" ";
50         p=p->next;
51     }
52     cout<<endl;
53 }
54 
55 struct ListNode* ReversePrint(struct ListNode* Head)
56 {
57     struct ListNode *p1,*p2,*p3;
58 
59     p1=Head;
60     p2=p1->next;
61 
62     while(p2!=NULL)
63     {
64         p3=p2->next;
65         p2->next=p1;
66         p1=p2;
67         p2=p3;
68     }
69 
70     Head->next=NULL;
71     return p1;
72 }
73 
74 int main()
75 {
76     ListNode *Head,*NewHead;
77     Head=CreateList();
78     PrintList(Head);
79     NewHead=ReversePrint(Head);
80 
81     cout<<endl<<"The Reverse List is:"<<endl;
82     PrintList(NewHead);
83     return 0;
84 }
复制代码

截图:

 

注意:这种情况下是破坏了链表的结构了。

 

 

下面我们用栈结构来实现不破链表本身结构的逆序输出:

复制代码
 1 #include <iostream>
 2 #include <stack>
 3 using namespace std;
 4 
 5 struct ListNode
 6 {
 7     int data;
 8     struct ListNode *next;
 9 };
10 
11 struct ListNode* CreateList()
12 {
13     struct ListNode* Head,*p;
14     Head=(struct ListNode*)malloc(sizeof(ListNode));
15     Head->data=0;
16     Head->next=NULL;
17     p=Head;
18 
19     cout<<"Create List....(0-exit!)"<<endl;
20     while(true)
21     {
22         int Data;
23         cin>>Data;
24         if(Data!=0)
25         {
26             struct ListNode* NewNode;
27             NewNode=(struct ListNode*)malloc(sizeof(ListNode));
28             NewNode->data=Data;
29             NewNode->next=NULL;
30             p->next=NewNode;
31             p=p->next;
32         }
33         else
34         {
35             break;
36         }
37     }
38 
39     return Head->next;
40 }
41 
42 void PrintList(struct ListNode* Head)
43 {
44     cout<<"The List is: ";
45 
46     struct ListNode *p;
47     p=Head;
48     while(p!=NULL)
49     {
50         cout<<p->data<<" ";
51         p=p->next;
52     }
53     cout<<endl;
54 }
55 
56 void ReversePrintByStack(struct ListNode* Head)
57 {
58     struct ListNode* p;
59     p=Head;
60 
61     stack<int> S;
62 
63     while(p!=NULL)
64     {
65         S.push(p->data);
66         p=p->next;
67     }
68 
69     cout<<"Reverse To Print LinkList: ";
70     while(!S.empty())
71     {
72         cout<<S.top()<<" ";
73         S.pop();
74     }
75 
76     cout<<endl;
77 }
78 
79 int main()
80 {
81     ListNode *Head,*NewHead;
82     Head=CreateList();
83     PrintList(Head);
84     ReversePrintByStack(Head);
85     return 0;
86 }
复制代码

截图:

 

哎 好困。


这篇关于剑指offer-面试题5.从尾到头打印链表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1104678

相关文章

csu1329(双向链表)

题意:给n个盒子,编号为1到n,四个操作:1、将x盒子移到y的左边;2、将x盒子移到y的右边;3、交换x和y盒子的位置;4、将所有的盒子反过来放。 思路分析:用双向链表解决。每个操作的时间复杂度为O(1),用数组来模拟链表,下面的代码是参考刘老师的标程写的。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#

深入手撕链表

链表 分类概念单链表增尾插头插插入 删尾删头删删除 查完整实现带头不带头 双向链表初始化增尾插头插插入 删查完整代码 数组 分类 #mermaid-svg-qKD178fTiiaYeKjl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-

荣耀嵌入式面试题及参考答案

在项目中是否有使用过实时操作系统? 在我参与的项目中,有使用过实时操作系统。实时操作系统(RTOS)在对时间要求严格的应用场景中具有重要作用。我曾参与的一个工业自动化控制项目就采用了实时操作系统。在这个项目中,需要对多个传感器的数据进行实时采集和处理,并根据采集到的数据及时控制执行机构的动作。实时操作系统能够提供确定性的响应时间,确保关键任务在规定的时间内完成。 使用实时操作系统的

建立升序链表

题目1181:遍历链表 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2744 解决:1186 题目描述: 建立一个升序链表并遍历输出。 输入: 输入的每个案例中第一行包括1个整数:n(1<=n<=1000),接下来的一行包括n个整数。 输出: 可能有多组测试数据,对于每组数据, 将n个整数建立升序链表,之后遍历链表并输出。 样例输

一些其他面试题

阿里二面:那你来说说定时任务?单机、分布式、调度框架下的定时任务实现是怎么完成的?懵了。。_哔哩哔哩_bilibili 1.定时算法 累加,第二层每一个格子是第一层的总时间400 ms= 20 * 20ms 2.MQ消息丢失 阿里二面:高并发场景下引进消息队列有什么问题?如何保证消息只被消费一次?真是捏了一把汗。。_哔哩哔哩_bilibili 发送消息失败

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

zookeeper相关面试题

zk的数据同步原理?zk的集群会出现脑裂的问题吗?zk的watch机制实现原理?zk是如何保证一致性的?zk的快速选举leader原理?zk的典型应用场景zk中一个客户端修改了数据之后,其他客户端能够马上获取到最新的数据吗?zk对事物的支持? 1. zk的数据同步原理? zk的数据同步过程中,通过以下三个参数来选择对应的数据同步方式 peerLastZxid:Learner服务器(Follo

java常用面试题-基础知识分享

什么是Java? Java是一种高级编程语言,旨在提供跨平台的解决方案。它是一种面向对象的语言,具有简单、结构化、可移植、可靠、安全等特点。 Java的主要特点是什么? Java的主要特点包括: 简单性:Java的语法相对简单,易于学习和使用。面向对象:Java是一种完全面向对象的语言,支持封装、继承和多态。跨平台性:Java的程序可以在不同的操作系统上运行,称为"Write once,

学习记录:js算法(二十八):删除排序链表中的重复元素、删除排序链表中的重复元素II

文章目录 删除排序链表中的重复元素我的思路解法一:循环解法二:递归 网上思路 删除排序链表中的重复元素 II我的思路网上思路 总结 删除排序链表中的重复元素 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 图一 图二 示例 1:(图一)输入:head = [1,1,2]输出:[1,2]示例 2:(图

【Kubernetes】常见面试题汇总(三)

目录 9.简述 Kubernetes 的缺点或当前的不足之处? 10.简述 Kubernetes 相关基础概念? 9.简述 Kubernetes 的缺点或当前的不足之处? Kubernetes 当前存在的缺点(不足)如下: ① 安装过程和配置相对困难复杂; ② 管理服务相对繁琐; ③ 运行和编译需要很多时间; ④ 它比其他替代品更昂贵; ⑤ 对于简单的应用程序来说,可能不