一个单向的链表,实现它的逆置并不难,我在网上看到了其中的一种算法,叫做就地逆置,它的实现思路让我花了好久的时间才理解清楚。。。(可能是我太笨了吧,敲打)
下面的代码从头到尾,展现了带头结点链表的初始化、建立、展示、逆置的过程。使用语言为标准C
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
typedef int Status; //函数状态类型
typedef int ElemType; //元素类型
typedef struct node{
ElemType data;
struct node *next;
}Node,*LinkList;//结点类型
Status InitList(LinkList *L);
Status CreatList(LinkList L,int n);
Status DisplayList(LinkList L);
Status Reverse(LinkList L);
int main(void)
{
LinkList L;
int L_Length;
InitList(&L);//初始化链表
printf("请输入单链表的长度:\n");
scanf("%d",&L_Length);
if(L_Length<1)
exit(-1);//长度不符合要求
printf("请依次输入各个元素的值:\n");
CreatList(L,L_Length);
DisplayList(L);
Reverse2(L);
printf("After reverseing!\n");
DisplayList(L);
return 0;
}
//初始化一个链表
Status InitList(LinkList *L)
{
*L = (LinkList)malloc(sizeof(node));
if(!(*L))
exit(-2);
return 1;
}
//在初始化的基础上按顺序创建一个链表
Status CreatList(LinkList L,int n)
{
LinkList p = L;
int i;
for(i=0;i<n;i++)
{
(p->next) = (LinkList)malloc(sizeof(node));
if(!(p->next))
exit(-2);
scanf("%d",&p->next->data);
p = p ->next;
}
p->next = NULL;
return 1;
}
//依次输出单链表中的各个元素
Status DisplayList(LinkList L)
{
LinkList p;
p = L->next;
while(p)
{
printf("%-5d",p->data);
p = p->next;
}
printf("\n");
return 1;
}
//逆置 (就地逆置)
Status Reverse(LinkList L)
{
LinkList last = L->next;
LinkList first;
while(last->next)
{
first = L->next;
L->next = last->next;
last->next = L->next->next;
L->next->next = first;
}
return 1;
}
我当时在分析这个逆置函数Reverse()时发生困难,按照我的思路,会写出这样的逆置函数:
Status Reverse(LinkList L)
{
LinkList p = L->next;
LinkList q = L->next->next;
LinkList t = NULL;
while(q != NULL)
{
t = q->next;
q->next = p;
p=q;
q = t;
}
L->next->next = NULL;//设置链表尾
L->next = p; //修改链表头
return 1;
}
我的思路可以按照下边的示意图来理解(花了半天画这个图,动手能力待加强啊!):
为了理解原先的逆置函数:
//逆置 (就地逆置)
Status Reverse(LinkList L)
{
LinkList last = L->next;
LinkList first;
while(last->next)
{
first = L->next;
L->next = last->next;
last->next = L->next->next;
L->next->next = first;
}
return 1;
}
我画出下边这个图,注意节点的连接关系每次循环first和last指向的节点都在变,终于完全的理解了,开心!我画了这两个图作为学习的笔记!链表的逆置必须画图才能更好的理解!