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

Posted cjt-blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《剑指offer》第二十四题(反转链表)相关的知识,希望对你有一定的参考价值。

// 面试题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: 
");
    PrintList(pHead);

    ListNode* pReversedHead = ReverseList(pHead);

    printf("The reversed list is: 
");
    PrintList(pReversedHead);

    return pReversedHead;
}

// 输入的链表有多个结点
void Test1()
{
    ListNode* pNode1 = CreateListNode(1);
    ListNode* pNode2 = CreateListNode(2);
    ListNode* pNode3 = CreateListNode(3);
    ListNode* pNode4 = CreateListNode(4);
    ListNode* pNode5 = CreateListNode(5);

    ConnectListNodes(pNode1, pNode2);
    ConnectListNodes(pNode2, pNode3);
    ConnectListNodes(pNode3, pNode4);
    ConnectListNodes(pNode4, pNode5);

    ListNode* pReversedHead = Test(pNode1);

    DestroyList(pReversedHead);//这都不忘删,你是魔鬼吗
}

// 输入的链表只有一个结点
void Test2()
{
    ListNode* pNode1 = CreateListNode(1);

    ListNode* pReversedHead = Test(pNode1);

    DestroyList(pReversedHead);
}

// 输入空链表
void Test3()
{
    Test(nullptr);
}

int main(int argc, char* argv[])
{
    Test1();
    Test2();
    Test3();
    system("pause");
    return 0;
}

 

以上是关于《剑指offer》第二十四题(反转链表)的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer(十四,十五)链表中倒数第k个结点,反转链表

剑指offer(二十三,二十四,二十五)最小的k个数,连续子数组的最大和,链表中环的入口节点

剑指offer系列刷题第二篇——从尾到头打印链表和反转链表

剑指offer:反转链表

《剑指offer》第六十四题:求1+2+…+n

《剑指offer》第十四题(剪绳子)