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

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

2015-07-21 11:43 597 查看
题目:输入一个链表的头结点,从尾到头反过来打印出每个结点的值。

刚看到这道题的小伙伴可能就会想,这还不简单,将链表反转输出。

但是这种情况破坏了链表的结构。

如果面试官要求不破坏链表结构呢,这时候我们就想到了一种数据

结构---栈 当我们从前往后遍历链表逐个压栈 然后遍历结束后再

逐个出栈。

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

#include <iostream>
using namespace std;

struct ListNode
{
int data;
struct ListNode *next;
};

struct ListNode* CreateList()
{
struct ListNode* Head,*p;
Head=(struct ListNode*)malloc(sizeof(ListNode));
Head->data=0;
Head->next=NULL;
p=Head;

cout<<"Create List....(0-exit!)"<<endl;
while(true)
{
int Data;
cin>>Data;
if(Data!=0)
{
struct ListNode* NewNode;
NewNode=(struct ListNode*)malloc(sizeof(ListNode));
NewNode->data=Data;
NewNode->next=NULL;
p->next=NewNode;
p=p->next;
}
else
{
break;
}
}

return Head->next;
}

void PrintList(struct ListNode* Head)
{
cout<<"The List is: ";

struct ListNode *p;
p=Head;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}

struct ListNode* ReversePrint(struct ListNode* Head)
{
struct ListNode *p1,*p2,*p3;

p1=Head;
p2=p1->next;

while(p2!=NULL)
{
p3=p2->next;
p2->next=p1;
p1=p2;
p2=p3;
}

Head->next=NULL;
return p1;
}

int main()
{
ListNode *Head,*NewHead;
Head=CreateList();
PrintList(Head);
NewHead=ReversePrint(Head);

cout<<endl<<"The Reverse List is:"<<endl;
PrintList(NewHead);
return 0;
}


截图:



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

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

#include <iostream>
#include <stack>
using namespace std;

struct ListNode
{
int data;
struct ListNode *next;
};

struct ListNode* CreateList()
{
struct ListNode* Head,*p;
Head=(struct ListNode*)malloc(sizeof(ListNode));
Head->data=0;
Head->next=NULL;
p=Head;

cout<<"Create List....(0-exit!)"<<endl;
while(true)
{
int Data;
cin>>Data;
if(Data!=0)
{
struct ListNode* NewNode;
NewNode=(struct ListNode*)malloc(sizeof(ListNode));
NewNode->data=Data;
NewNode->next=NULL;
p->next=NewNode;
p=p->next;
}
else
{
break;
}
}

return Head->next;
}

void PrintList(struct ListNode* Head)
{
cout<<"The List is: ";

struct ListNode *p;
p=Head;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}

void ReversePrintByStack(struct ListNode* Head)
{
struct ListNode* p;
p=Head;

stack<int> S;

while(p!=NULL)
{
S.push(p->data);
p=p->next;
}

cout<<"Reverse To Print LinkList: ";
while(!S.empty())
{
cout<<S.top()<<" ";
S.pop();
}

cout<<endl;
}

int main()
{
ListNode *Head,*NewHead;
Head=CreateList();
PrintList(Head);
ReversePrintByStack(Head);
return 0;
}


截图:



哎 好困。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: