您的位置:首页 > 职场人生

《剑指Offer》学习笔记--面试题5:从尾到头打印链表

2015-05-04 21:32 701 查看
题目:输入一个链表的头结点,从尾到头反过来打印出每个节点的值。

链表节点定义如下:

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;
}
上面的基于递归的代码看起来很简洁,但有个问题:当链表非常长的时候,就会导致函数调用的层级很深,从而有可能导致函数调用栈溢出。显式用栈基于循环实现的代码的鲁棒性要好一些。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: