题目:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
链表定义如下:
struct ListNode
{
int value;
ListNode* next;
};
思路:首先将pCur和pNext指向第一个数据结点,phead的指针域置为NULL,再将pNext指向pCur指向结点的下一个结点,pCur的指针域指向phead指向的结点,phead的指针域指向pCur,pCur指向pNext指向的结点,经过上面这些过程此时该带头结点的单链表中只有一个数据,不断重复上面的过程就可将此单链表反转,下图画出了将数据1和2逆置的过程。
将数据1反转:
将数据2反转:
反转后的结果如下所示:
具体代码如下所示:
#include <iostream>
#include <assert.h>
using namespace std;
struct ListNode
{
int value;
ListNode* next;
};
void Init(ListNode* pListHead)
{
assert(pListHead != NULL);
if(pListHead == NULL)
{
return ;
}
pListHead->next=NULL;
}
static ListNode* Buynode()
{
ListNode *pnewnode=new ListNode();
assert(pnewnode != NULL);
pnewnode->next=NULL;
return pnewnode;
}
bool InsertTail(ListNode *pListHead,int val)
{
if(pListHead == NULL)
{
return false;
}
ListNode *pCur=pListHead;
while(pCur->next != NULL)
{
pCur=pCur->next;
}
ListNode *pnewnode=Buynode();
pnewnode->value=val;
pCur->next=pnewnode;
return true;
}
ListNode* ReverseList(ListNode* pListHead)
{
if(pListHead == NULL)
{
return false;
}
ListNode *pCur=pListHead->next;
ListNode *pNext=pCur;
pListHead->next=NULL;
ListNode *pReverseHead=NULL;
while(pCur != NULL)
{
pNext=pCur->next;
if(pNext == NULL)
{
pReverseHead=pCur;
}
pCur->next=pListHead->next;
pListHead->next=pCur;
pCur=pNext;
}
return pReverseHead;
}
void Print(ListNode* pListHead)
{
if(pListHead == NULL)
{
return;
}
struct ListNode* pCur=pListHead->next;
while(pCur != NULL)
{
cout<<pCur->value<<" ";
pCur=pCur->next;
}
cout<<endl;
}
void Clear(ListNode* pListHead)
{
struct ListNode* pCur=pListHead->next;
struct ListNode* pNext=pCur;
while(pCur != NULL)
{
pNext=pCur->next;
free(pCur);
pCur=pNext;
}
pListHead->next=NULL;
}
void Destory(ListNode* pListHead)
{
Clear(pListHead);
}
int main()
{
ListNode pListHead;
Init(&pListHead);
for(int i=0;i<6;i++)
{
InsertTail(&pListHead,i+1);
}
Print(&pListHead);
ListNode *tmp;
tmp=ReverseList(&pListHead);
Print(&pListHead);
cout<<tmp->value<<endl;
Destory(&pListHead);
Print(&pListHead);
return 0;
}
运行结果如下所示: