思路:
将头节点摘下,然后以第一个节点开始依次插入到头节点的后面(模仿头插法)知道最后一个节点,如此就是就地逆置算法!
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
LinkList L;//定义全局变量L, 可以省略参数传递;
LinkList Head_insert()
{
LNode *s;
int x;
L=(LinkList ) malloc(sizeof(LNode));
L->next=NULL;//开辟头节点
printf("请输入数据: \n");
scanf("%d",&x);
while(x != 999)
{
s=(LNode * ) malloc(sizeof(LNode));
s->data=x;
s->next=L->next;
L->next=s;
scanf("%d",&x);
}
return L;
}
void print_List()
{
LinkList p;
p=L->next;
while( p )
{
printf("%5d",p->data);
p=p->next;
}
}
LinkList reverse_List()
{
LinkList head;
head=L;
LNode *q,*p;
p=head->next; //p指向首节点;
head->next=NULL;//断开头指针;
while( p )
{
q=p->next;//用q记录p的后继
p->next=head->next;//将p节点插入到head节点之后
head->next=p;
p=q; //p后移
}
return head;
}
int main()
{
printf("Hello world!\n");
Head_insert();
printf("输出单链表: \n");
print_List();
printf("\n");
printf("就地逆置单链表: \n");
reverse_List();
print_List();
return 0;
}