首先先来看一下链表的结构,如下图结构体所示,链表的节点包括两部分,数据域和指针域。
typedef struct Node
{
int data;//数据域
struct Node *next;//指向下一个节点
}Node,*List;
对于单链表的逆置有两种方法,第一种是改变指针方向,第二种是利用头插的思想,将数据节点依次头插进链表,就可以得到逆置后的链表。
有以下单链表
1、改变指针方向
void Reverse(List plist)
{
if(plist==NULL||plist->next==NULl||plist->next->next==NULL)
{
return;
}
Node *p=plist->next;//从第一个头结点开始
Node *q=p->next;
Node *s;
p->next=NULL;
while(q!=NULL)
{
s=q->next;
q->next=p;//改变指针方向
p=q;//指针后移
q=s;//指针后移
}
plist->next=p;
}
根据上图代码所示,在执行q->next=p这句代码时 就相当于指针转变了方向,由原来的p指向q,变成了q指向p,然后指针后移。如下图所示
2、头插思想
void Rsverse(List plist)
{
if(plist==NULL||plist->next==NULL||plist->next->next==NULL)
{
return;
}
Node *p=plist->next;
Node *q;
plist->next=NULL;
while(p!=NULL)
{
q=p->next;
p->next=plist->next;//将p头插进链表
plist->next=p;
p=q;
}
}
通过将每一个结点重新头插入链表,也能得到逆置的链表