数据结构之单链表的原地逆置:
算法思想:
从单链表的第一个结点开始,用头插法再次插入链表,此时,链表中元素的次序就是原来顺序的逆序。
代码:
#include<stdio.h>
#include<stdlib.h>
#define ElemType int
#define maxsize 20
typedef struct ListNode
{
ElemType data;
struct ListNode* next;
}ListNode,*LinkList; //定义结点
//-------------------头插法建立一个单链表-----------------------
LinkList InitList(LinkList l)
{
l=(ListNode*)malloc(sizeof(ListNode));
l->next=NULL;
int i=1;
ListNode* s;
for(i=1;i<20;i++)
{
s=(ListNode*)malloc(sizeof(ListNode));
s->data=i;
s->next=l->next;
l->next=s;
}
return l;
}
//-------------------------原地逆置函数---------------------------
LinkList Reverse(LinkList l)
{
ListNode* p;
ListNode* s;
p=l->next;
s=p->next;
l->next=NULL;
while(p!=NULL)
{
p->next=l->next;
l->next=p;
p=s;
if(p!=NULL)
s=p->next;
}
return l;
}
void PrintList(LinkList l)
{
ListNode* s;
s=l->next;
while(s!=NULL)
{
printf("%d ",s->data);
s=s->next;
}
printf("\n\n\n");
}
int main()
{
LinkList LL;
LL=InitList(LL);
printf("逆置前链表的顺序为:\n");
PrintList(LL);
LL=Reverse(LL);
printf("逆置后链表的顺序为:\n");
PrintList(LL);
}
运行结果: