算法实现带头结点单链表就地逆置问题
代码如下:
#include"stdio.h"
#include"stdlib.h"
typedef struct LNode
{
int data;
struct LNode *next;
} LNode,*LinkList;
//创建链表
void creatList(LinkList L,int n)
{
LinkList p,q;
p=L;
int i;
for(i=1; i<=n; i++)
{
q=(LinkList)malloc(sizeof(LNode));
scanf("%d",&q->data);
q->next=NULL;
p->next=q;
p=q;
}
}
void reverseList(LinkList L)
{
LinkList p,q;
p=L->next; /*p为原链表当前处理结点*/
L->next=NULL; /*逆置单链表初始为空表*/
while(p!=NULL) /*当原链表未处理完*/
{
q=p->next; /*q指针保留原链表当前处理结点的下一个结点*/
p->next=L->next; /*将当前处理结点p插到逆置表L的表头*/
L->next=p;
p=q; /*p指向下一个待插入的结点*/
}
}
//输出
void output(LinkList L)
{
LinkList p;
p=L;
while(p->next)
{
p=p->next;
printf("%2d",p->data);
}
printf("\n");
}
int main(void)
{
LNode L;
int n;
printf("输入数据个数:");
scanf("%d",&n);
printf("输入单链表数据:");
creatList(&L,n);
printf("逆置前的单链表:");
output(&L);
reverseList(&L);
printf("逆置后的单链表:");
output(&L);
return 0;
}