每天一道算法题41-反转链表

本文深入解析了链表反转的两种核心方法:递归法与遍历法,通过具体代码示例,展示了每种方法的实现细节及优劣对比。

除了使用栈的特性或者另外开辟内存从后往前拷贝,另外有两种方法,分别是递归法和遍历法,其中遍历法更加节省内存,递归法写起来逻辑简单。

遍历法用图来表示:

递归法用图来表示:

详细逻辑可以参考:Java单链表反转 详细过程

代码如下:

#include "iostream"
struct NODE_T
{
	int data;
	struct NODE_T* pdata;
};

//1.递归反转法
NODE_T* reverse1(NODE_T* head)
{
	if (NULL==head->pdata)
	{
		return head;
	}

	NODE_T* rHead = reverse1(head->pdata);
	head->pdata->pdata = head;
	head->pdata = NULL;
	return rHead;
}

//2.遍历反转法
NODE_T* reverse2(NODE_T* head)
{
	if (NULL == head->pdata)
	{
		return head;
	}

	NODE_T* pCurrent,*pNext,*pBefore;
	pCurrent = head;
	pNext = pCurrent->pdata;
	pBefore = NULL;
	while (NULL != pNext)
	{
		pCurrent->pdata = pBefore;
		pBefore = pCurrent;

		pCurrent = pNext;
		pNext = pCurrent->pdata;
	}

	pCurrent->pdata = pBefore;

	return pCurrent;
}

void main()
{
	//1.initiation
	NODE_T nodes[10];
	for (int i = 0; i < 10; i++)
	{
		nodes[i].data = i;
		nodes[i].pdata = i == 9 ? NULL : &nodes[i+1];
	}
	NODE_T* head = nodes;
	printf("\n before:");
	while (head !=NULL)
	{
		printf("%d,",head->data);
		head = head->pdata;
	}

	//2.reverse1
	if (0)
	{
		head = reverse1(nodes);
		printf("\n aftrer:");
		while (head != NULL)
		{
			printf("%d,", head->data);
			head = head->pdata;
		}
	}
	else
	{
		//3.reverse2
		head = reverse2(nodes);
		printf("\n aftrer:");
		while (head != NULL)
		{
			printf("%d,", head->data);
			head = head->pdata;
		}
	}

	return;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值