写一点基础的东西--单向链表的反转
链表反转:单向链表的反转是一个非常基础的问题。
比如一个链表是这样的: 1->2->3->4->5 通过反转后成为5->4->3->2->1。
单链表结构如下:
struct SingleNode {
int iValue;
SingleNode * pNext;
};
目的:写一个函数实现链表的翻转;
用两种方式实现一种是递归,一种是while遍历
附上代码,有打印验证。
#include "stdafx.h"
#include <stdlib.h>
struct SingleNode {
int iValue;
SingleNode * pNext;
};
//递归实现
SingleNode* OverTrun(SingleNode* pHead);
//while遍历实现
SingleNode* OverTrun2(SingleNode* pHead);
void PrintList(SingleNode* pHead);
int _tmain(int argc, _TCHAR* argv[])
{
SingleNode* pHead = new SingleNode();
pHead->iValue = 1;
SingleNode* p2 = new SingleNode();
p2->iValue = 2;
pHead->pNext = p2;
SingleNode* p3 = new SingleNode();
p3->iValue = 3;
p2->pNext = p3;
PrintList(pHead);
SingleNode* pNewHead = NULL;
pNewHead = OverTrun(pHead);
printf("打印翻转后的链表...\n");
PrintList(pNewHead);
printf("方法2再次翻转链表...\n");
pNewHead =OverTrun2(pNewHead);
PrintList(pNewHead);
system("pause");
delete pHead;
delete p2;
delete p3;
return 0;
}
//递归:单向链表翻转函数
SingleNode* OverTrun(SingleNode* pHead)
{
SingleNode* pTempNext = pHead->pNext;
if (pTempNext == NULL)
{
return pHead;
}
else
{
pHead->pNext = NULL;
SingleNode* pRes = OverTrun(pTempNext);
pTempNext->pNext = pHead;
return pRes;
}
}
//while遍历:单向链表翻转函数
SingleNode* OverTrun2(SingleNode* pHead)
{
SingleNode* pPreNode = NULL;
SingleNode* pTempNext = NULL;
while (pHead != NULL)
{
pTempNext = pHead->pNext;
//指针反转
pHead->pNext = pPreNode;
//处理原链表的下一个结点
pPreNode = pHead;
pHead = pTempNext;
}
return pPreNode;
}
//打印链表数据函数
void PrintList(SingleNode* pHead)
{
while (pHead)
{
printf(" %d \n", pHead->iValue);
pHead = pHead->pNext;
}
}
如果对你有一点点帮助,欢迎下方评论;