数据结构实验之链表三:链表的逆置
Time Limit: 1000MS Memory Limit: 65536KB
Problem Description
输入多个整数,以-1作为结束标志,顺序建立一个带头结点的单链表,之后对该单链表的数据进行逆置,并输出逆置后的单链表数据。
Input
输入多个整数,以-1作为结束标志。
Output
输出逆置后的单链表数据。
Example Input
12 56 4 6 55 15 33 62 -1
Example Output
62 33 15 55 6 4 56 12
Hint
不得使用数组。
Author
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
struct node
{
int data;/// 链表的数据域
struct node *next;/// 链表的指针域
};
struct node *creat()///顺序简练表
{
struct node *head,*p,*q;
head=(struct node *)malloc(sizeof(struct node ));/// 为头结点分配空间
head->next=NULL;///赋为空
q=head;
int t;
while(~scanf("%d",&t) && t!=-1)/// 向链表中添加元素
{
p=(struct node *)malloc(sizeof(struct node ));
p->data=t;
p->next=NULL;
q->next=p;
q=p;/// 更新尾节点
}
return head;
};
void change(struct node *head)/// 单链表的逆置
{
struct node *p,*q,*t;///游动指针
/****思路 先把头结点分离开 然后用后面的元素逆序建链表****/
p=head->next;
head->next=NULL;
while(p)
{
t=head->next;
head->next=p;
p=p->next;/// 及时更行p的值 否则在下一行的代码中会将p->next 修改为NULL
head->next->next=t;/// 将 新链表后面的 链接在头结点后面的节点后
}
}
void output(struct node *head)///遍历链表
{
struct node *p=head->next;
while(p)
{
printf("%d%c",p->data,p->next==NULL?'\n':' ');
p=p->next;
}
}
int main()
{
struct node *head=NULL;/// 建立链表的头结点 并为空
head=creat();///顺序建练表
change(head);
output(head);/// 遍历链表
return 0;
}