算法题之二(从尾到头打印链表)

链表节点定义如下:

1 typedef struct ListNode
2 {
3     int value;
4     ListNode *next;
5 }TListNode;

众所周知,链表打印时从头到尾很简单,所以我们首先想到的可能是先把链表逆序,然后从头到尾再打印出来即可,但是逆序会破坏链表的结构,对于打印操作来说仅仅是读操作而已,如果破坏了链表结构似乎不和常理,哪么我们是否有更好的解决办法呢?答案是肯定的。

我们知道要解决该问题肯定需要遍历链表,而第一个遍历的节点需要最后一个打印出来,而最后一个遍历的节点需要最先被打印出来,这是一个很典型的“后入先出”,我们能很迅速的想到用栈来解决该问题,我们只需要在遍历时依次将结点压入栈中,再从栈顶依次输出每个结点的值即达到目的。这种思路实现代码如下:

 1 void PrintListReversing(TListNode *head)
 2 {
 3     stack<TListNode*> nodes;
 4
 5     TListNode *pnode = head;
 6     while (NULL != pnode)
 7     {
 8         nodes.push(pnode);
 9
10         pnode = pnode->next;
11     }
12
13     while (!nodes.empty())
14     {
15         pnode = nodes.top();
16
17         cout << pnode->value << endl;
18
19         nodes.pop();
20     }
21 }

既然想到用栈来实现,而递归本身就是一个栈结构,因而不难想出用递归的方式来实现,实现代码如下所示:

 1 void PrintListReversing2(TListNode *head)
 2 {
 3     if (NULL != head)
 4     {
 5         if (NULL != head->next)
 6         {
 7             PrintListReversing2(head->next);
 8         }
 9
10         cout << head->value << endl;
11     }
12 }

上面的实现代码非常简洁,但是如果链表中结点数很多,可能会导致函数栈溢出,因此实际编码中应该避免使用。

算法题之二(从尾到头打印链表)

时间: 2024-08-27 21:54:12

算法题之二(从尾到头打印链表)的相关文章

《剑指offer》第五题(重要!从尾到头打印链表)

文件main.cpp // 从尾到头打印链表 // 题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值. #include <iostream> #include <stack> #include "List.h" using namespace std; void PrintListReversingly_Iteratively(ListNode* pHead)//解法一:使用栈 { stack<ListNode*> nodes;//定义

刷题6 从尾到头打印链表

描述:  输入一个链表,从尾到头打印链表每个节点的值. 最初思路: 1 /** 2 * struct ListNode { 3 * int val; 4 * struct ListNode *next; 5 * ListNode(int x) : 6 * val(x), next(NULL) { 7 * } 8 * }; 9 */ 10 class Solution { 11 public: 12 vector<int> printListFromTailToHead(ListNode* he

九度oj题目1511:从尾到头打印链表

题目1511:从尾到头打印链表 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:6010 解决:1805 题目描述: 输入一个链表,从尾到头打印链表每个节点的值. 输入: 每个输入文件仅包含一组测试样例.每一组测试案例包含多行,每行一个大于0的整数,代表一个链表的节点.第一行是链表第一个节点的值,依次类推.当输入到-1时代表链表输入完毕.-1本身不属于链表. 输出: 对应每个测试案例,以从尾到头的顺序输出链表每个节点的值,每个值占一行. 样例输入: 1 2 3 4 5 -1 样例输出

剑指offer | 从尾到头打印链表

题目描述: “输入一个链表,从尾到头打印链表每个节点的值.” 这是我做的<剑指offer>系列的第一题,好的开头就是成功的一半.然而,我提交了一次,WA!再提交,WA!Com'on! 看来我的开端并不顺利.不过我要的可不是成功的一半,这样的开端怎么能阻挡我AC之路!仔细看了一遍题目要求,看了提交格式.再提交! Finally,AC! 代码如下: 1 /** 2 * struct ListNode { 3 * int val; 4 * struct ListNode *next; 5 * Lis

剑指Offers 题目1511:从尾到头打印链表

题目1511:从尾到头打印链表 题解报告:方法一.链表创建,头插法,方法二.运用栈,注意栈可能溢出~! #include <iostream> #include <stack> #include <cstdio> using namespace std; // stack int main() { int num; stack<int> List; while(scanf("%d", &num) && num !=

剑指offer——从尾到头打印链表节点的值

输入一个链表,从尾到头打印链表每个节点的值. 输入描述:输入为链表的表头 输出描述:输出为需要打印的“新链表”的表头 一.问题分析 初拿到这个题目时,这应该是考察单向链表这一数据结构.单向链表的遍历总是从头指针逐项遍历各个节点,现在要求从尾到头打印节点的值,我们可以在遍历时把各节点压入栈内,最后出栈打印各个节点值,即可达到要求. 实现之前,我们先来看看如何创建一个链表. 1,链表节点的数据结构定义 1 struct ListNode { 2 int val; 3 struct ListNode

题目五:从尾到头打印链表

////////////////////////////////////////////////////////////////////////////////////////////// // 8.题目五:从尾到头打印链表 // 方法一:时间复杂度O(n),空间复杂度O(n) template <typename TYPE> void ReversePrintList1(ListNode<TYPE>* pNode) { assert(NULL != pNode); stack&l

LeetCode | 面试题06. 从尾到头打印链表【剑指Offer】【Python】

LeetCode 面试题06. 从尾到头打印链表[剑指Offer][Easy][Python][链表] 问题 力扣 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 限制: 0 <= 链表长度 <= 10000 思路 解法一 reverse函数 时间复杂度: O(n),n为 head 链表长度. 空间复杂度: O(n),n为 head 链表长度. Python3代码 # Definition for si

《剑指Offer》题目——从尾到头打印链表

题目描述:输入一个链表,从尾到头打印链表每个节点的值. 题目分析:用栈:Java用Stack不如用Deque接口,原因可以见链接:http://stackoverflow.com/questions/12524826/why-should-i-use-deque-over-stack public class ReverseList { class ListNode{ int val; ListNode next = null; ListNode(int val){ this.val = val