我自己的链表逆序是通过三个指针,不停地进行位置的变换,然后直接对单向链表进行逆序,但我这里的单链表逆序的是因为没为我没有咋测试函数中进行返回值的接受,所以没行头指针的变换,大家看的时候注意一下,思路是我的思路,不需要头指针的自己改变一下测试函数以及初始化函数和释放函数就可了,思路图如下:
这张图便是直接翻转的思路,利用三个移动的指针,一个不动的指针,在开始的时候,先保证 bef 的 next 是指向 NULL 的,然后循环开始,在第一次的时候,先将 me 的 next 指向 bef,然后三个指针依次向后一动一个位置,到达第二次的时候,也是让me 的 next 指向 bef,这样写一个循环,就可以达到第三次的情况,第三次的情况是循环结束后的情况,这个时候,就只需要将me 的 next 指向 bef,aft 的 next 指向 me,然后将 head 的 next 指向 aft 就可以了,这就完车了一次直接逆序。代码如下:
void ListOrder(List *me)
{
List * head = me;
List * bef = me->next;
me = bef->next;
List * aft = bef->next->next;
bef->next = NULL;
while (aft->next)
{
me->next = bef;
bef = me;
me = aft;
aft = aft->next;
}
me->next = bef;
aft->next = me;
head->next = aft;
}
这个是逆序代码,下面是测试代码,相比之下多了打印函数和初始化函数:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
typedef struct List//数据类型
{
int date;
struct List * next;
}List;
void ListInit(List * list)//初始化函数
{
List* tmp = list;
for (int i = 0; i < 10; i++)//进行动态内存开辟,这里是从第二个节点开始动态内存开辟的
{
list->date = i;
list->next = (List *)malloc(sizeof(List));
list = list->next;
}
list->date = 10;
list->next = NULL;
}
void ListPrint(List *me)// 打印函数,遇到NULL停止
{
while (me->next)
{
printf("%d\n", me->date);
me = me->next;
}
printf("%d\n", me->date);
}
void ListFree(List *me)//释放函数,这里有一点就是malloc函数是从第二个节点开始的,所以释放的时候也是从第二个节点开始的
{
List* tmp = me->next;
me = me->next;
for (int i = 0; i < 10; i++)
{
me = me->next;
free(tmp);
tmp = me;
}
}
void ListOrder(List *me)
{
List * head = me;
List * bef = me->next;
me = bef->next;
List * aft = bef->next->next;
bef->next = NULL;//开始循环前,一定要进行结果的最后一个节点的next为NULL
while (aft->next)//循环的情况
{
me->next = bef;
bef = me;
me = aft;
aft = aft->next;
}
me->next = bef;//一下是第三次的情况,最后的处理
aft->next = me;
head->next = aft;
}
int main()
{
List me;
ListInit(&me);
ListPrint(&me);
ListOrder(&me);
ListPrint(&me);
ListFree(&me);//释放空间,因为是malloc开辟的空间,所以一定要释放
return 0;
}