- 题目描述:
-
输入一个链表,反转链表后,输出链表的所有元素。
(hint : 请务必使用链表)
- 输入:
-
输入可能包含多个测试样例,输入以EOF结束。
对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000):代表将要输入的链表的个数。
输入的第二行包含n个整数t(0<=t<=1000000):代表链表元素。
- 输出:
-
对应每个测试案例,
以此输出链表反转后的元素,如没有元素则输出NULL。
- 样例输入:
-
5 1 2 3 4 5 0
- 样例输出:
-
5 4 3 2 1 NULL
解法一:
每次读入时都使当前节点指向上一个读入的节点,这样,输入完毕形成了一个翻转的链表,顺序打印即可.
参考:http://blog.csdn.net/jizhuzhong/article/details/10469397
AC代码:
#include<stdio.h> #include<stdlib.h> typedef struct node { int data; struct node *next; } linklist; int main() { int n, m; linklist *l, *p; while(scanf("%d", &n) != EOF) { if(n == 0) printf("NULL"); l = (linklist *)malloc(sizeof(linklist)); if(!l) exit(0); l->next = NULL; while(n--) { p = (linklist *)malloc(sizeof(linklist)); scanf("%d", &m); p->data = m; p->next = l->next; /*l->next总是指向上一个节点*/ l->next = p; /*把当前节点暂存起来,供下次使用*/ } p = l->next; /*tail*/ while(p) { printf("%d", p->data); if(p->next) printf(" "); p = p->next; } printf("\n"); free(p); p = NULL; free(l); l = NULL; } return 0; } /************************************************************** Problem: 1518 User: wusuopuBUPT Language: C Result: Accepted Time:150 ms Memory:2364 kb ****************************************************************/
解法二:
输入完毕后再做翻转处理:
参考:http://blog.csdn.net/sunnyyoona/article/details/16856539
AC代码:
#include<stdio.h> #include<stdlib.h> typedef struct node { int data; struct node *next; } linklist; void debug(linklist *p) { while(p) { printf("%d\t", p->data); p = p->next; } printf("\n"); } linklist *reverseList(linklist *head) { if(head == NULL) { return NULL; } else { linklist *p, *temp, *pNext; temp = NULL; p = head->next; while(p) { pNext = p->next; /*backup previous p->next*/ if(pNext == NULL) { head = p; } p->next = temp; temp = p; p = pNext; } /*debug*/ //debug(head); return head; } } int main() { int i, m, n; while(scanf("%d", &n) != EOF) { linklist *head, *tail, *p; head = (linklist *)malloc(sizeof(linklist)); head->next = NULL; tail = head; for(i = 0; i < n; i++){ scanf("%d", &m); p = (linklist *)malloc(sizeof(linklist)); p->data = m; p->next = NULL; tail->next = p; tail = p; } /*debug*/ //debug(head->next); if(n == 0) printf("NULL"); else { head = reverseList(head); p = head; while(p) { printf("%d", p->data); if(p->next) printf(" "); p = p->next; } } printf("\n"); free(p); p = NULL; free(head); head = NULL; } return 0; } /************************************************************** Problem: 1518 User: wusuopuBUPT Language: C Result: Accepted Time:150 ms Memory:2364 kb ****************************************************************/