《剑指Offer》学习笔记--面试题5:从尾到头打印链表
2015-05-04 21:32
701 查看
题目:输入一个链表的头结点,从尾到头反过来打印出每个节点的值。
链表节点定义如下:
struct ListNode{
int m_nKey;
ListNode* m_pNext;
};
解题思路:
首先想到的是把链表翻转过来,然后再按顺序输出。但是这个方法会改变原来链表的结构,通常打印是一个只读操作,所以一般情况下不要改变原来的值或者结构。那么在这个假设下,我们想到肯定要遍历链表的,我们可以利用一个栈来实现,因为栈是后进先出的,所以按顺序遍历链表然后把值压入栈,最后从栈中弹出,这个时候的序列就是我们想要的结果了。
代码如下:
链表节点定义如下:
struct ListNode{
int m_nKey;
ListNode* m_pNext;
};
解题思路:
首先想到的是把链表翻转过来,然后再按顺序输出。但是这个方法会改变原来链表的结构,通常打印是一个只读操作,所以一般情况下不要改变原来的值或者结构。那么在这个假设下,我们想到肯定要遍历链表的,我们可以利用一个栈来实现,因为栈是后进先出的,所以按顺序遍历链表然后把值压入栈,最后从栈中弹出,这个时候的序列就是我们想要的结果了。
代码如下:
#include <iostream> #include <stack> using namespace std; typedef struct Node{ int m_value; struct Node* next; }Node; typedef struct Node *LinkList; LinkList Create(int n) { int data; LinkList pHead = new Node(); Node* pNew = pHead; cin>>data; pNew->m_value = data; n--; while(n--){ Node* Lnode = new Node(); cin>>data; pNew->next = Lnode; Lnode->m_value = data; pNew = Lnode; } pNew->next = NULL; return pHead; } //迭代算法 void PrintListReversingly_Iteratively(LinkList pHead) { if(pHead == NULL){ return; } stack<LinkList> nodes; LinkList pNode = pHead; while(pNode != NULL){ nodes.push(pNode); pNode = pNode->next; } while(!nodes.empty()){ pNode = nodes.top(); cout<<pNode->m_value<<" "; nodes.pop(); } } //递归算法 void PrintListReversingly_Recursively(LinkList pHead) { if(pHead != NULL){ if(pHead->next != NULL){ PrintListReversingly_Recursively(pHead->next); } cout<<pHead->m_value<<" "; } } int main() { int n; cout<<"请输入节点个数:"<<endl; cin>>n; Node* pHead; pHead = Create(n); typedef void (*Fun)(LinkList); Fun pFunc = NULL; //pFunc = PrintListReversingly_Iteratively; pFunc = PrintListReversingly_Recursively; pFunc(pHead); system("pause"); return 0; }上面的基于递归的代码看起来很简洁,但有个问题:当链表非常长的时候,就会导致函数调用的层级很深,从而有可能导致函数调用栈溢出。显式用栈基于循环实现的代码的鲁棒性要好一些。
相关文章推荐
- 剑指Offer学习之面试题5 : 从尾到头打印链表
- 剑指Offer学习总结-从尾到头打印链表
- 剑指Offer面试题5(Java版):从尾到头打印链表
- 剑指Offer: 面试题5 从尾到头打印链表
- 《剑指Offer》学习笔记--面试题20:顺时针打印矩阵
- 《剑指Offer》学习笔记--面试题23:从上往下打印二叉树
- 《剑指offer》面试题5—从尾到头打印链表
- 剑指Offer系列-面试题5:从尾到头打印链表
- 剑指offer--面试题5:从尾到头打印链表
- 《剑指Offer》学习笔记--面试题60:把二叉树打印出多行
- 剑指offer 面试题5 从尾到头打印链表(栈实现)
- 剑指offer之面试题5:从尾到头打印链表
- 《剑指Offer》学习笔记--面试题37:两个链表的第一个公共结点
- [剑指offer学习心得]之:从尾到头打印链表
- 《剑指Offer》学习笔记--面试题17:合并两个排序的链表
- 剑指Offer(第二版)面试题6:从尾到头打印链表
- 《剑指Offer》学习笔记--面试题56:链表中环的入口结点
- 《剑指Offer》学习笔记--面试题61:按之字形顺序打印二叉树
- 《剑指Offer》学习笔记--面试题12:打印1到最大的n位数
- 剑指offer 面试题5 从尾到头打印链表