单链表就地逆置算法
在C语言中为了减少时间和空间,对单链表采用就地逆置的方法,话不多说,完整代码如下。
#include<stdio.h>
#include<malloc.h>
#define LEN sizeof (struct Node)
struct Node
{
int data;//定义数据域
struct Node *next;//定义指针域
int length;//记录顺序表的长度
};
//建立动态链表
struct Node *crt_list()
{
struct Node *h, *p,*q;
int n;
h=(struct Node *)(malloc(LEN));
q=h;
printf("请输入一串整型数据(-1结束输入):\n");
scanf("%d",&n);//输入数据
while(n!=-1)
{
p=(struct Node*)(malloc(LEN));
p->data=n;
q->next=p;//联接头节点
q=p;//指针移动
scanf("%d",&n);//再次输入数据
}
q->next=NULL;//条件为假,退出循环,将最后一个节点标志为尾结点
return h;
}
//输出链表
void prt_list(struct Node *h)
{
struct Node *p;
p=h->next;//指向第一个节点
if(p==NULL)
printf("Linked list is null\n");
else
while(p!= NULL)
{
printf("%d",p->data);//输出数据
p=p->next;//指针移动
}
}
//就地逆置
void NiZhi_list(struct Node *h)
{
struct Node *p,*q,*x;
p=h->next;
h->next=NULL;
while(p!=NULL)
{
q=p;
p=p->next;
q->next=h->next;
h->next=q;
}
x=h->next;
if(x==NULL)
printf("链表为空");
else
while(x!=NULL)
{
printf("%d",x->data);
x=x->next;
}
}
void main()
{
struct Node *head; //定义一个结构体头指针
head=crt_list();//head指向建立的链表
printf("当前链表为: \n");
prt_list(head);
printf("\n");
printf("就地逆置后的链表为: \n");
NiZhi_list(head);
printf("\n");
}