除了使用栈的特性或者另外开辟内存从后往前拷贝,另外有两种方法,分别是递归法和遍历法,其中遍历法更加节省内存,递归法写起来逻辑简单。
遍历法用图来表示:
递归法用图来表示:
详细逻辑可以参考: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;
}