// test4.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
struct Node
{
int mNum;
Node *pNext;
};
Node* g_Head;
void CreateNode()
{
static int i = 1;
Node* pTem = (Node *)malloc(sizeof(Node));
pTem->mNum = i;
pTem->pNext = NULL;
if(NULL == g_Head)
{
g_Head = pTem;
}
else
{
Node* pMove = g_Head;
while(NULL != pMove->pNext)
{
pMove = pMove->pNext;
}
pMove->pNext = pTem;
}
i++;
}
void Invalude()
{
for(int i = 0;i < 10;i++)
{
CreateNode();
}
}
//核心算法.
void ChangeListEx()
{
if (g_Head == NULL)
{
return;
}
Node* pLastNode = NULL; //赋值上一结点
Node* pMoveNode = g_Head; //真实遍历过程中此 瞬间 结点
Node* pSaveNext = NULL; //提前保存下一结点环境,供恢复使用
while(pMoveNode != NULL)
{
pSaveNext = pMoveNode->pNext;
pMoveNode->pNext = pLastNode;
pLastNode = pMoveNode;
g_Head = pMoveNode; //while顺利结束,g_Head就是逆转后的头节点了.
pMoveNode = pSaveNext;
}
}
//链表反转算法、(开始)
void ChangeList()
{
Node* pLojicalNext = NULL; //while真实指向结点,或者遍历控制结点
Node* pRemoval = NULL; //反转之后的头
if(NULL != g_Head && NULL != g_Head->pNext)
{
pRemoval = g_Head;
pLojicalNext = g_Head->pNext;
Node* pSaveNextRemoval = NULL;
Node* pSaveNextLojical = NULL;
while(pLojicalNext != NULL)
{
//提前存储逻辑下一个节点
pSaveNextRemoval = pLojicalNext;
if (NULL != pLojicalNext)
{
pSaveNextLojical = pLojicalNext->pNext;
}
//反转
pLojicalNext->pNext = pRemoval;
//恢复逻辑下一个节点
pRemoval = pLojicalNext;
pLojicalNext = pSaveNextLojical;
}
g_Head->pNext = NULL;
g_Head = pRemoval;
}
}
//逆转链表算法(终止)
int main(int argc, char* argv[])
{
Invalude();
//ChangeList();
ChangeListEx();
return 0;
}
//
#include "stdafx.h"
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
struct Node
{
int mNum;
Node *pNext;
};
Node* g_Head;
void CreateNode()
{
static int i = 1;
Node* pTem = (Node *)malloc(sizeof(Node));
pTem->mNum = i;
pTem->pNext = NULL;
if(NULL == g_Head)
{
g_Head = pTem;
}
else
{
Node* pMove = g_Head;
while(NULL != pMove->pNext)
{
pMove = pMove->pNext;
}
pMove->pNext = pTem;
}
i++;
}
void Invalude()
{
for(int i = 0;i < 10;i++)
{
CreateNode();
}
}
//核心算法.
void ChangeListEx()
{
if (g_Head == NULL)
{
return;
}
Node* pLastNode = NULL; //赋值上一结点
Node* pMoveNode = g_Head; //真实遍历过程中此 瞬间 结点
Node* pSaveNext = NULL; //提前保存下一结点环境,供恢复使用
while(pMoveNode != NULL)
{
pSaveNext = pMoveNode->pNext;
pMoveNode->pNext = pLastNode;
pLastNode = pMoveNode;
g_Head = pMoveNode; //while顺利结束,g_Head就是逆转后的头节点了.
pMoveNode = pSaveNext;
}
}
//链表反转算法、(开始)
void ChangeList()
{
Node* pLojicalNext = NULL; //while真实指向结点,或者遍历控制结点
Node* pRemoval = NULL; //反转之后的头
if(NULL != g_Head && NULL != g_Head->pNext)
{
pRemoval = g_Head;
pLojicalNext = g_Head->pNext;
Node* pSaveNextRemoval = NULL;
Node* pSaveNextLojical = NULL;
while(pLojicalNext != NULL)
{
//提前存储逻辑下一个节点
pSaveNextRemoval = pLojicalNext;
if (NULL != pLojicalNext)
{
pSaveNextLojical = pLojicalNext->pNext;
}
//反转
pLojicalNext->pNext = pRemoval;
//恢复逻辑下一个节点
pRemoval = pLojicalNext;
pLojicalNext = pSaveNextLojical;
}
g_Head->pNext = NULL;
g_Head = pRemoval;
}
}
//逆转链表算法(终止)
int main(int argc, char* argv[])
{
Invalude();
//ChangeList();
ChangeListEx();
return 0;
}