单链表的逆序

我自己的链表逆序是通过三个指针,不停地进行位置的变换,然后直接对单向链表进行逆序,但我这里的单链表逆序的是因为没为我没有咋测试函数中进行返回值的接受,所以没行头指针的变换,大家看的时候注意一下,思路是我的思路,不需要头指针的自己改变一下测试函数以及初始化函数和释放函数就可了,思路图如下:

这张图便是直接翻转的思路,利用三个移动的指针,一个不动的指针,在开始的时候,先保证 bef next 是指向 NULL 的,然后循环开始,在第一次的时候,先将 me next 指向 bef,然后三个指针依次向后一动一个位置,到达第二次的时候,也是让menext 指向 bef,这样写一个循环,就可以达到第三次的情况,第三次的情况是循环结束后的情况,这个时候,就只需要将menext 指向 befaftnext 指向 me,然后将 headnext 指向 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;

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值