算法思想:
首先将头结点摘下,重新构造链表,然后原链表中的结点依次头插到新链表中,如此循环,直到链表为空,即可逆置链表。
代码:
//链表逆置
#include<stdio.h>
#include<malloc.h>
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
LinkList Reverse(LinkList &L)
{
LinkList p,q;
p=L->next;
L->next=NULL; //重新构造单链表
while(p!=NULL)
{
q=p;
p=p->next;
q->next=L->next; //头插法
L->next=q;
}
return L;
}
int main()
{
LinkList A = (LinkList)malloc(sizeof(LNode));
LinkList a1 = (LinkList)malloc(sizeof(LNode));
LinkList a2 = (LinkList)malloc(sizeof(LNode));
LinkList a3 = (LinkList)malloc(sizeof(LNode));
LinkList a4 = (LinkList)malloc(sizeof(LNode));
A->next=a1;
a1->next=a2;
a2->next=a3;
a3->next=a4;
a4->next=NULL;
a1->data=1;
a2->data=2;
a3->data=3;
a4->data=4;
LinkList p=A->next;
printf("A中元素:");
while(p){
printf("%d ",p->data);
p=p->next;
}
p=Reverse(A);
printf("\n单链表逆置之后A中的元素:\n");
for(p=p->next;p!=NULL;p=p->next)
{
printf("%d ",p->data);
}
return 0;
}
大家可以结合图解,进一步理解。
初始状态
循环前的操作
进入第一轮循环,分别用q,p记录第1个和第2个结点
进入第2轮循环
直到链表为空,最终链表为: