下面内容来自: https://blog.csdn.net/blioo/article/details/62050967
假设当前创建好的链表如下:
首先让头结点与第一个元素节点断开,但是要注意在断开之前需要用p指针指向第一个元素节点来保存第一个元素节点位置,然后在断开。在这里有一个指针q指向一个指针域为空的节点,这个节点用来作为链表反转后的最后一个节点。
让第二个元素节点的指针从指向第三个元素节点变为指向第一个元素节点,以此类推,直至指针p指向原链表最后一个元素。
p指针指向NULL时,让原头节点的指针域指向原来最后一个元素节点。此时链表倒置已完成。
【根据博客内容,我编写相关的代码: 实现完整的逆置过程】
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef struct Link
{
char elem;
struct Link* next;
}link;
link* initLink()
{
link* p = (link*)malloc(sizeof(link));
link* temp = p;
//生成链表
for (int i = 1; i < 5; i++)
{
link* a = (link*)malloc(sizeof(link));
a->elem = i;
a->next = NULL;
temp->next = a;
temp = temp->next;
}
return p;
}
void display(link* p)
{
link* temp = p;//将temp指针重新指向头结点
//只要temp指针指向的结点的next不是Null,就执行输出语句。
while (temp->next)
{
temp = temp->next;
printf("%d ", temp->elem);
}
printf("\n");
}
link reverse(link *ph) {
link *p, *q, *pr;
p = ph->next;
q = NULL;
ph->next = NULL;
while (p) {
pr = p->next;
p->next = q;
q = p;
p = pr;
}
ph->next = q;
return *ph;
}
/* 主函数 */
int main(int argc, char** argv)
{
link *p = initLink();
display(p);
reverse(p); // 链表倒置。。
display(p);
system("pause");
}