本文共 1916 字,大约阅读时间需要 6 分钟。
地址:http://ac.jobdu.com/problem.php?pid=1518
题目1518:反转链表
输入一个链表,反转链表后,输出链表的所有元素。
(hint : 请务必使用链表)
输入可能包含多个测试样例,输入以EOF结束。
对于每个测试案例,输入的第一行为一个整数n(0<=n<=1000):代表将要输入的链表的个数。 输入的第二行包含n个整数t(0<=t<=1000000):代表链表元素。
对应每个测试案例,
以此输出链表反转后的元素,如没有元素则输出NULL。
51 2 3 4 50
5 4 3 2 1NULL
3个指针,分别指向当前遍历到的节点,它的前一个节点及后一个节点。
检查:
1、链表头指针为NULL
2、整个链表只有一个节点
注:代码含有头节点
#include#include struct listNode { int data; listNode *next;};listNode* reverse(listNode *head){ if(head->next == NULL) return NULL; listNode *p, *q, *r; p = head; q = head ->next;//指向第一个节点 if(q->next == NULL)//只有一个节点,无需逆转 return head; r = q->next; while(r != NULL) { q ->next = p; if(p == head) q->next = NULL; p = q; q = r; r = r->next; } q ->next = p; head->next = q; return head;}int main(){ int n; while(scanf("%d", &n) != EOF) { listNode *head = (listNode *)malloc(sizeof(listNode)); head->data = 0; head->next = NULL; listNode *p, *q; q = head; for(int i = 0; i < n; i ++) { p = (listNode *)malloc(sizeof(listNode)); scanf("%d", &p->data); p->next = NULL; q->next = p; q = q->next; } p = reverse(head); if(p != NULL) { int flag = 0; while(p->next != NULL) { p = p->next; if(flag == 0) { printf("%d", p->data); flag = 1; } else printf(" %d", p->data); } printf("\n"); } else printf("NULL\n"); }}/************************************************************** Problem: 1518 Language: C++ Result: Accepted Time:150 ms Memory:2472 kb****************************************************************/
转载地址:http://kesob.baihongyu.com/