题目1518:反转链表 点击打开链接
-
题目描述:
-
输入一个链表,反转链表后,输出链表的所有元素。
(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
/*
* 剑指Offer - 面试题16: 反转链表
* 九度OJ - 题目1372:反转链表
*/
#include <iostream>
using namespace std;
struct ListNode {
int data;
struct ListNode* next;
};
typedef struct ListNode* List;
void reverse_list(List &l);
int main(int argc, char* argv[]) {
int n;
while (cin >> n) {
if (n == 0) {
cout << "NULL" << endl;
continue;
}
int tmp;
List L = (List) new ListNode();
L->next = NULL;
ListNode *next = L;
for (int i = 0; i < n; i++) {
ListNode *node = new ListNode();
cin >> tmp;
node->data = tmp;
node->next = NULL;
next->next = node;
next = node; //这里刚才出错 next = node->next;(node->next已经置为NULL)
}
reverse_list(L);
L = L->next;
bool flag = false;
while (L) {
if(flag)
cout << " ";
cout << L->data;
flag = true;
L = L->next;
}
cout << endl;
}
}
void reverse_list(List &l) {
ListNode *p = l->next;
l->next = NULL;
while (p) {
ListNode *tmp = p->next;
p->next = l->next;
l->next = p;
p = tmp;
}
}