面试题5 从头到尾打印链表
2014-11-01 20:42
323 查看
题目描述:
输入一个链表,从尾到头打印链表每个节点的值。
输入:
每个输入文件仅包含一组测试样例。
每一组测试案例包含多行,每行一个大于0的整数,代表一个链表的节点。第一行是链表第一个节点的值,依次类推。当输入到-1时代表链表输入完毕。-1本身不属于链表。
输出:
对应每个测试案例,以从尾到头的顺序输出链表每个节点的值,每个值占一行。
样例输入:
样例输出:
解题:
1. 第一种解法可以逆转指针,需要改变链表的结构;
2. 第二种解法从尾到头输出,符合栈的后进先出原则,不过需要建立栈;
3. 第三种解法直接递归,先输出后面的值,再输出当前节点的值
注意:
最后要回收所有的节点,还有九度的OJ别用cin,cout,不知道为毛会超时,害的我想了半天,把cout改成printf就AC了
代码1(第一种解法):
代码2(第三种解法):
输入一个链表,从尾到头打印链表每个节点的值。
输入:
每个输入文件仅包含一组测试样例。
每一组测试案例包含多行,每行一个大于0的整数,代表一个链表的节点。第一行是链表第一个节点的值,依次类推。当输入到-1时代表链表输入完毕。-1本身不属于链表。
输出:
对应每个测试案例,以从尾到头的顺序输出链表每个节点的值,每个值占一行。
样例输入:
1 2 3 4 5 -1
样例输出:
5 4 3 2 1
解题:
1. 第一种解法可以逆转指针,需要改变链表的结构;
2. 第二种解法从尾到头输出,符合栈的后进先出原则,不过需要建立栈;
3. 第三种解法直接递归,先输出后面的值,再输出当前节点的值
注意:
最后要回收所有的节点,还有九度的OJ别用cin,cout,不知道为毛会超时,害的我想了半天,把cout改成printf就AC了
代码1(第一种解法):
/*********************************** Author: Date: Mail: Description: 5. 从尾到头打印链表 /**********************************/ #include<iostream> #include<cstdio> using namespace std; typedef int ElementType; typedef struct Node* Linknode; struct Node { ElementType data; Linknode next; }; void reverse_link(Linknode head) { Linknode p,q,r; q = head->next; p = q->next; //q为第一个节点 if(p == NULL) return; //一个节点,不用逆转 q->next = NULL; while( p!= NULL) { r = p->next; p->next = q;; q = p; p = r; } head->next = q; } void prints(Linknode head) { Linknode p = head->next; while(p != NULL) { //cout<<p->data<<endl; printf("%d\n",p->data); p = p->next; } } void free(Linknode p) { if(p == NULL) return; free(p->next); delete p; } int main() { int n; Linknode head, p, q; q = head = new Node; head->next = NULL; while(scanf("%d",&n) == 1 && n != -1) { p = new Node; p->data = n; p->next = NULL; q->next = p; q = p; } reverse_link(head); prints(head); free(head); return 0; }
代码2(第三种解法):
#include<iostream> #include<cstdio> #include<cstdlib> using namespace std; typedef int ElementType; typedef struct Node* Linknode; struct Node { ElementType data; Linknode next; }; void printsr(Linknode p) { if(p == NULL) return; printsr(p->next); printf("%d\n",p->data); //cout<<p->data<<endl; } void free(Linknode p) { if(p == NULL) return; free(p->next); delete p; } int main() { int n; Linknode head, p, q; q = head = new Node; head->next = NULL; while(scanf("%d",&n) == 1 && n != -1) { p = new Node; p->data = n; p->next = NULL; //创建个节点 q->next = p; q = p; } printsr(head->next); free(head); return 0; }
相关文章推荐
- 《剑指Offer》面试题-从头到尾打印链表
- 面试题5:从头到尾打印链表
- 面试题5 从头到尾打印链表
- 剑指offer 面试题5——从头到尾打印链表
- 【剑指offer】面试题6:从头到尾打印链表
- 《剑指offer》(面试题5):从头到尾打印链表
- 单链表面试题(二)从头到尾打印单链表
- 《剑指Offer》面试题-从头到尾打印链表
- 剑指offer面试题5 从头到尾打印链表(java)
- 面试题5-从头到尾打印链表
- 面试题5:从头到尾打印链表
- 剑指offer面试题之从头到尾打印链表
- 剑指Offer-【面试题05:从头到尾打印链表】
- 剑指offer编程题Java实现——面试题5从头到尾打印链表
- 剑指offer--面试题6:从头到尾打印链表
- 《剑指offer》面试题5 从头到尾打印链表
- 剑指offer面试题5 从头到尾打印链表(java)
- 【剑指offer】面试题五:从尾到头打印链表