#include<stdio.h>
#include<malloc.h>
//****************************************宏定义******************************************************
typedef struct LNode
{
int data;
struct LNode *next;
}*LinkList;
void Create_List_Tail(LinkList &L)
{
int n;
LNode *s,*p; //s代表要插入的结点,p指向尾结点,L代表头结点
printf("链表长为:");
scanf("%d",&n);
L=(LinkList)malloc(sizeof(LNode)); //建立头结点
L->next=NULL; //头结点指向空
p=L; //p始终指向尾结点,初始化时也指向头结点
for(int i=0;i<n;i++)
{
s=(LinkList)malloc(sizeof(LNode));
scanf("%d",&s->data);
p->next=s;
p=s;
}
p->next=NULL; //尾指针指向空
}//尾建表
//************************************* Print_List(LinkList L)**************************************
int Print_List(LinkList L)
{
LNode *p=L->next;
printf("打印链表: ");
while(p)
{
printf("%d ",p->data);
p=p->next;
}
return 0;
}//打印
int Reverse_List_1(LinkList &L)
{
LNode *p1,*p2,*p3;
if(L==NULL||L->next ==NULL)
return 0;
p1=NULL;
p2=L->next;
while(p2!=NULL) //p2为当前要操作的结点
{
p3=p2->next; //p3记住当前结点的下一个结点
p2->next =p1; //使p2指向自己的前驱,完成反转
p1=p2; // p1和p2同时向后移动
p2=p3;
}
L->next=p1;
return 0;
}
int Reverse_List_2(LinkList &L)
{
//从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后
LNode *p1,*p2;
if(L==NULL||L->next ==NULL)
return 0;
p1=L->next ; //p1指向首结点
while(p1->next)
{
p2=p1->next; //p2记住当前结点的下一个结点
p1->next =p2->next ;
p2->next =L->next ;
L->next =p2;
}
return 0;
}
int main()
{
LinkList L;
Create_List_Tail(L);
printf("进行反转链表,");
Reverse_List_1(L);
Print_List(L);
printf("\n\n");
printf("再次反转,");
Reverse_List_2(L);
Print_List(L);
printf("\n\n");
return 0;
}
剑指offer--面试题24:反转链表
最新推荐文章于 2023-03-10 22:39:15 发布