单链表的反转代码如下:
typedef struct LNode //定义单链表结点类型
{
int data; //数据域
struct LNode *next; //指针域
}LNode, *LinkList;
LinkList reverse_list(LinkList L) //L是带头结点的单链表
{
LNode *p, *r; //p为工作指针,r为p的后继,以防断链
p = L->next; //从第一个元素头结点开始
L->next = NULL; //先将头结点L的next域置为NULL
while(p != NULL) { //依次将元素结点摘下
r = p->next; //暂存p的后继
p->next = L->next; //将p结点插入到头结点之后
L->next = p;
p = r;
}
return L;
}
第一步:
①先让结点p指向结点①处;②将头结点L的next域断开,设置为NULL,得到下图:
第二步:
在while()里面,先把结点r缓存起来,然后将结点p插入到头结点L后面(头插法),插入的过程是先执行下图中的③,然后在执行④,对应代码上p->next = L->next; L->next = p; 这两句。
第三步:
执行完上面两个语句之后,把工作指针结点p往后移动一个位置(即移动到r指向的结点),然后再重复执行插入p结点到头结点L的后面。
直到结点p移动到最后一个位置后,指针变为NULL后结束整个循环,完成了链表反转
参考:
[1] 王道考研系列. 数据结构