《剑指offer》第二十四题(反转链表)

时间:2022-02-01 17:04:29
// 面试题24:反转链表
// 题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的
// 头结点。 #include <iostream>
#include "List.h" ListNode* ReverseList(ListNode* pHead)
{
ListNode* pReversedHead = nullptr;//设置三个节点变量,第一是已经被反转的头节点(原链表尾节点)
ListNode* pNode = pHead;//第二个是当前节点
ListNode* pPrev = nullptr;//第三是原链表中当前节点的前一个节点
while (pNode != nullptr)
{
ListNode* pNext = pNode->m_pNext;//pNext是原链表中当前节点的后一个节点 if (pNext == nullptr)
pReversedHead = pNode; pNode->m_pNext = pPrev; pPrev = pNode;
pNode = pNext;
} return pReversedHead;
} // ====================测试代码====================
ListNode* Test(ListNode* pHead)
{
printf("The original list is: \n");
PrintList(pHead); ListNode* pReversedHead = ReverseList(pHead); printf("The reversed list is: \n");
PrintList(pReversedHead); return pReversedHead;
} // 输入的链表有多个结点
void Test1()
{
ListNode* pNode1 = CreateListNode();
ListNode* pNode2 = CreateListNode();
ListNode* pNode3 = CreateListNode();
ListNode* pNode4 = CreateListNode();
ListNode* pNode5 = CreateListNode(); ConnectListNodes(pNode1, pNode2);
ConnectListNodes(pNode2, pNode3);
ConnectListNodes(pNode3, pNode4);
ConnectListNodes(pNode4, pNode5); ListNode* pReversedHead = Test(pNode1); DestroyList(pReversedHead);//这都不忘删,你是魔鬼吗
} // 输入的链表只有一个结点
void Test2()
{
ListNode* pNode1 = CreateListNode(); ListNode* pReversedHead = Test(pNode1); DestroyList(pReversedHead);
} // 输入空链表
void Test3()
{
Test(nullptr);
} int main(int argc, char* argv[])
{
Test1();
Test2();
Test3();
system("pause");
return ;
}