// 019.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <malloc.h>
struct ListNode
{
int m_nKey;
struct ListNode *m_pNext;
};
struct ListNode *CreatList(int number)
{
struct ListNode *head = NULL;
struct ListNode *cur = NULL;
struct ListNode *temp = NULL;
head = (struct ListNode*)malloc(sizeof(struct ListNode));
if (NULL == head)
{
return NULL;
}
head->m_nKey = 0;
head->m_pNext = NULL;
temp = head;
printf("List data number %d\n", number);
for (int i=0; i<number; i++)
{
cur = (struct ListNode*)malloc(sizeof(struct ListNode));
if (cur == NULL)
{
return NULL;
}
printf("List Id%02d ", i);
printf("Input data ");
scanf("%d", &cur->m_nKey);
cur->m_pNext = NULL;
if (i==0)
{
head = cur;
temp = cur;
}
else
{
cur->m_pNext = NULL;
temp->m_pNext = cur;
}
temp = cur;
}
return head;
}
//反转列表节点
//思路 在某一链表中存在 【pPrev】【pNode】【pNext】
//反转时pNode节点时,必须得保存其下一个节点,
//否则出现断链(因为pNode得m_pNext得指向pPrev)
struct ListNode* Reverse(struct ListNode* pHead)
{
if (NULL == pHead)
{
return NULL;
}
struct ListNode *pPrev = NULL;
struct ListNode *pNode = pHead;
struct ListNode *pNext = NULL;
struct ListNode *pReverseHead = NULL;
while(pNode != NULL)
{
pNext = pNode->m_pNext;//保留当前遍历到节点的下一个节点
if (pNext == NULL)
{
pReverseHead = pNode;//当前节点即尾节点
}
pNode->m_pNext = pPrev;//翻转节点
//节点关系向右边递进
pPrev = pNode;
pNode = pNext;
}
return pReverseHead;
}
bool PrintList(struct ListNode* pHead)
{
if (NULL == pHead)
{
return false;
}
int i=0;
struct ListNode* pTemp = pHead;
do
{
++i;
printf("List number: %d Data:%d\n",i, pTemp->m_nKey);
pTemp = pTemp->m_pNext;//pTemp指向下一个节点的指针
} while (pTemp != NULL);//最后一个节点的指针元素为NULL
return true;
}
//题目翻转链表
int main(int argc, char* argv[])
{
// printf("Hello World!\n");
struct ListNode *pHead = NULL;
pHead = CreatList(5);
pHead = Reverse(pHead);
PrintList(pHead);
return 0;
}
019-翻转列表
最新推荐文章于 2022-02-10 15:50:31 发布