剑指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; }
截图:
哎 好困。
相关文章推荐
- 黑马程序员---面向对象中的内部类
- 黑马程序员—JAVA基础—String类 javaAPI学习
- 面试时可以向面试官提那些问题
- 推荐!国外程序员整理的 PHP 资源大全
- 剑指offer-面试题4.替换空格
- 告别迷茫与忧伤的程序员
- 面试-阻塞队列及线程池
- 面试-锁相关
- 面试-并发概述
- 面试-JVM
- 黑马程序员—— 6,多态
- 面试-MySQL
- 索引面试题荟萃
- 黑马程序员——java基础——多态
- 黑马程序员----JAVA基础----IO流_1
- 黑马程序员——java基础——接口
- Java面试-Hibernate总结
- 黑马程序员——Java交通灯管理系统&银行业务系统
- Web程序员开发5个诀窍
- 程序员开发编程经验知识总结