题目描述
根据一个整数序列构造一个单链表,然后将其反转。
例如:原单链表为 2 3 4 5 ,反转之后为5 4 3 2
输入
输入包括多组测试数据,每组测试数据占一行,第一个为大于等于0的整数n,表示该单链表的长度,后面跟着n个整数,表示链表的每一个元素。整数之间用空格隔开
输出
针对每组测试数据,输出包括两行,分别是反转前和反转后的链表元素,用空格隔开
如果链表为空,则只输出一行,list is empty
样例输入
5 1 2 3 4 5
0
样例输出
1 2 3 4 5
5 4 3 2 1
list is empty
思路
这里是一个单链表反转问题,其实就是一个改变指针指向的问题,思路如下:
假设当前链表如下:
我们的目的是改变箭头的指向,即改成如下形式:
所以,可以先创建一个p结点,等于结点1,创建一个q指针指向NULL(作为反转后的链表的最后一个结点),然后断开头结点与结点1,使头结点指向NULL
然后让结点p的指针指向结点q
然后更新p和q,来往后推进
接着,仍然让p的指针指向q,此时便连接了结点1和2
再接着更新p和q
以此类推,直到到达p为NULL为止,此时,如下所示
此时,便可令头结点指针指向q即可
代码如下
#include <iostream>
#include <algorithm>
using namespace std;
struct node
{
int data;
node *next;
};
node *creatList(int n) //创建链表
{
node *p, *pre, *head;
head = new node;
head->next = NULL;
pre = head;
for (int i = 0; i < n; i++)
{
p = new node;
cin >> p->data;
p->next = NULL;
pre->next = p;
pre = p;
}
return head;
}
node * reverse(node *head)//链表反转
{
node *p,*q,*pr;
p=head->next;
q = NULL;
head->next=NULL;
while(p)
{
pr = p->next;
p->next = q;
q=p;
p=pr;
}
head->next=q;
return head;
}
void showList(node *L1)//输出链表
{
node *pre = L1->next;
while (pre != NULL)
{
cout << pre->data << " ";
pre = pre->next;
}
}
int main()
{
int n;
while(~scanf("%d",&n))
{
if(n==0){
cout<<"list is empty"<<endl;
break;
}else{
node *head = creatList(n);
showList(head);
cout<<endl;
head = reverse(head);
showList(head);
cout<<endl;
}
}
return 0;
}