题目:
有一个单链表的第一个节点指针为head,编写一个函数将该单链表逆置,即最后一个节点变成第一个节点,原来倒数第二个节点变成第二个节点,如此等等,在逆置中不能建立新的单链表。
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode{
int data; //链表数据
struct LNode* next; //链表指针
}LNode,*LinkList;
int main()
{
int i,data,count=0;
LinkList L;
LinkList p;
LinkList q;
LinkList temp;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL; //头结点
q = L;
printf("请输入你的任意个整数,用空格隔开,输入大写字母Q表示结束!\n");
do
{
scanf("%d",&data);
p = (LinkList)malloc(sizeof(LNode));
//printf("请输入元素值: ");
//scanf("%d",&p->data);
p->data =data;
p->next = NULL;q->next = p;q = p;
count++;
}while(getchar() != 'Q');
q = L->next;
i=1;
printf("链表结点数为:%d\n",count);
printf("逆置前的链表元素的序列:\n");
while(i <= count) //按序输出链表元素
{
printf("NO.%d:",i);
printf("%5d\t",q->data);
q = q->next;
if(0 == i%4)
printf("\n");
i++;
}
printf("\n");
//链表逆置
q = L->next;
temp=q->next;
for(i = 1;i < count;i++)
{
if(temp->next != NULL)
{//当链表中还有至少三个结点没有逆置时
p = temp;
temp = p->next;
p->next = q;
q = p;
}
else
{// 当链表中只有两个结点没有逆置时
temp->next=q;
q=temp;
}
}
L->next = q;//吧头指针的next指向逆置后的第一个元素
//输出逆置后的链表元素
q = L->next;
i=1;
printf("逆置后的链表元素的序列:\n");
while(i <= count) //按序输出链表元素
{
printf("NO.%d:",i);
printf("%5d\t",q->data);
q = q->next;
if(0 == i%4)
printf("\n");
i++;
}
printf("\n");
//释放空间
p = L->next;
i=1;
while(i++ <= count)
{
q = p;
p = p->next;
free(q);
}
return 0;
}