链表逆置有很多方法,这里为了自己看着方便和应付考试,总结了一下。用的都是最普遍的遍历更改指针指向的方法:
首先是单链表逆置
typedef struct node{
int data;
struct node *next;
}Lnode,*Linklist;
Linklist ReviseList(Linklist L)
{
Lnode *p,*q,*s; //头结点逆置
if(L->next == NULL)
return L;
p=L->next;
q=p->next;
p->next=NULL;
while(q)
{
s=q->next;
q->next=p;
p=q;
q=s;
}
L->next=p;
return L;
}
运行结果:
循环单链表逆置
typedef struct node{
int data;
struct node *next;
}Lnode,*Linklist;
//循环单链表的逆置
//从头指针开始遍历,在遍历过程中改变各节点的指针
//(由原来的指向后继改为指向前驱)
Linklist Inverse(Linklist L)
{
Lnode *p,*q,*r;
if(L->next==L)
{
printf("空表\n");
return 0;
}//空表返回
p=L->next; //从第一个节点开始
q=p->next; //下一个节点
p->next=L; //原来第一个节点变为最后一个节点
while(q!=L) //下一个节点不是头结点
{
r=q->next; //再下一个
q->next=p;
p=q;
q=r;
}
L->next=p;
return L;
}
运行
双链表逆置
typedef struct node{
int data;
struct node *prior;
struct node *next;
}Lnode,*Linklist;
//双向链表的逆置
Linklist ReviseList(Linklist L)
{
if(L->next == NULL)
return L;
Lnode *p,*q,*s; //头结点逆置
p=L->next;
q=p->next;
p->next=NULL;
while(q)
{
s=q->next;
q->next=p;
q->prior=p->next;//比单链表之多了这一句
p=q;
q=s;
}
L->next=p;
return L;
}
运行
循环双链表逆置
typedef struct node{
int data;
struct node *prior;
struct node *next;
}Lnode,*Linklist;
//循环双链表的逆置
Linklist Reverse(Linklist L)
{
if(L->next == NULL)
return L;
Lnode *p,*q,*s; //头结点逆置
p=L->next;
q=p->next;
p->next=NULL;
while(q!=L)
{
s=q->next;
q->next=p;
q->prior=p->next;//比单链表之多了这一句
p=q;
q=s;
}
L->next=p;
return L;
}
运行结果