• 【面试题026】复杂链表的复制


    【面试题026】复杂链表的复制
    请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表。在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任意结点或者NULL。结点的C++定义如下:
     C++ Code 
    1
    2
    3
    4
    5
    6
     
    struct ComplexListNode
    {
        int m_nValue;
        ComplexListNode *m_pNext;
        ComplexListNode *m_pSibling;
    }
     
    ComplexList.h
     C++ Code 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    #ifndef _Complex_List_Node_
    #define _Complex_List_Node_


    struct ComplexListNode
    {
        int                 m_nValue;
        ComplexListNode    *m_pNext;
        ComplexListNode    *m_pSibling;
    };

    ComplexListNode *CreateNode(int nValue);
    void BuildNodes(ComplexListNode *pNode, ComplexListNode *pNext, ComplexListNode *pSibling);
    void PrintList(ComplexListNode *pHead);


    #endif //_Complex_List_Node_
    ComplexList.cpp
     C++ Code 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    #include "ComplexList.h"
    #include <iostream>/*NULL值的头文件*/


    ComplexListNode *CreateNode(int nValue)
    {
        ComplexListNode *pNode = new ComplexListNode();

        pNode->m_nValue = nValue;
        pNode->m_pNext = NULL;
        pNode->m_pSibling = NULL;

        return pNode;
    }

    void BuildNodes(ComplexListNode *pNode, ComplexListNode *pNext, ComplexListNode *pSibling)
    {
        if(pNode != NULL)
        {
            pNode->m_pNext = pNext;
            pNode->m_pSibling = pSibling;
        }
    }

    void PrintList(ComplexListNode *pHead)
    {
        ComplexListNode *pNode = pHead;
        while(pNode != NULL)
        {
            std::cout << "The value of this node is: " << pNode->m_nValue << std::endl;

            if(pNode->m_pSibling != NULL)
                std::cout << "The value of its sibling is: " << pNode->m_pSibling->m_nValue << std::endl;
            else
                std::cout << "This node does not have a sibling." << std::endl;

            std::cout << std::endl;

            pNode = pNode->m_pNext;
        }
    }
     
    CopyComplexList.cpp
     C++ Code 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
     
    #include <iostream>
    #include "ComplexList.h"

    using namespace std;


    void CloneNodes(ComplexListNode *pHead);
    void ConnectSiblingNodes(ComplexListNode *pHead);
    ComplexListNode *ReconnectNodes(ComplexListNode *pHead);

    ComplexListNode *Clone(ComplexListNode *pHead)
    {
        CloneNodes(pHead);
        ConnectSiblingNodes(pHead);
        return ReconnectNodes(pHead);
    }

    void CloneNodes(ComplexListNode *pHead)
    {
        ComplexListNode *pNode = pHead;
        while(pNode != NULL)
        {
            ComplexListNode *pCloned = new ComplexListNode();
            pCloned->m_nValue = pNode->m_nValue;
            pCloned->m_pNext = pNode->m_pNext;
            pCloned->m_pSibling = NULL;

            pNode->m_pNext = pCloned;

            pNode = pCloned->m_pNext;
        }
    }

    void ConnectSiblingNodes(ComplexListNode *pHead)
    {
        ComplexListNode *pNode = pHead;
        while(pNode != NULL)
        {
            ComplexListNode *pCloned = pNode->m_pNext;
            if(pNode->m_pSibling != NULL)
            {
                pCloned->m_pSibling = pNode->m_pSibling->m_pNext;
            }

            pNode = pCloned->m_pNext;
        }
    }

    ComplexListNode *ReconnectNodes(ComplexListNode *pHead)
    {
        ComplexListNode *pNode = pHead;
        ComplexListNode *pClonedHead = NULL;
        ComplexListNode *pClonedNode = NULL;

        if(pNode != NULL)
        {
            pClonedHead = pClonedNode = pNode->m_pNext;
            pNode->m_pNext = pClonedNode->m_pNext;
            pNode = pNode->m_pNext;
        }

        while(pNode != NULL)
        {
            pClonedNode->m_pNext = pNode->m_pNext;
            pClonedNode = pClonedNode->m_pNext;

            pNode->m_pNext = pClonedNode->m_pNext;
            pNode = pNode->m_pNext;
        }

        return pClonedHead;
    }

    // ====================测试代码====================
    void Test(char *testName, ComplexListNode *pHead)
    {
        if(testName != NULL)
            printf("%s begins: ", testName);

        cout << "The original list is:" << endl;
        PrintList(pHead);

        ComplexListNode *pClonedHead = Clone(pHead);

        cout << "The cloned list is:" << endl;
        PrintList(pClonedHead);
    }

    //          -----------------
    //         |/              |
    //  1-------2-------3-------4-------5
    //  |       |      /|             /|
    //  --------+--------               |
    //          -------------------------
    void Test1()
    {
        ComplexListNode *pNode1 = CreateNode(1);
        ComplexListNode *pNode2 = CreateNode(2);
        ComplexListNode *pNode3 = CreateNode(3);
        ComplexListNode *pNode4 = CreateNode(4);
        ComplexListNode *pNode5 = CreateNode(5);

        BuildNodes(pNode1, pNode2, pNode3);
        BuildNodes(pNode2, pNode3, pNode5);
        BuildNodes(pNode3, pNode4, NULL);
        BuildNodes(pNode4, pNode5, pNode2);

        Test("Test1", pNode1);
    }

    // m_pSibling指向结点自身
    //          -----------------
    //         |/              |
    //  1-------2-------3-------4-------5
    //         |       | /|           /|
    //         |       | --             |
    //         |------------------------|
    void Test2()
    {
        ComplexListNode *pNode1 = CreateNode(1);
        ComplexListNode *pNode2 = CreateNode(2);
        ComplexListNode *pNode3 = CreateNode(3);
        ComplexListNode *pNode4 = CreateNode(4);
        ComplexListNode *pNode5 = CreateNode(5);

        BuildNodes(pNode1, pNode2, NULL);
        BuildNodes(pNode2, pNode3, pNode5);
        BuildNodes(pNode3, pNode4, pNode3);
        BuildNodes(pNode4, pNode5, pNode2);

        Test("Test2", pNode1);
    }

    // m_pSibling形成环
    //          -----------------
    //         |/              |
    //  1-------2-------3-------4-------5
    //          |              /|
    //          |               |
    //          |---------------|
    void Test3()
    {
        ComplexListNode *pNode1 = CreateNode(1);
        ComplexListNode *pNode2 = CreateNode(2);
        ComplexListNode *pNode3 = CreateNode(3);
        ComplexListNode *pNode4 = CreateNode(4);
        ComplexListNode *pNode5 = CreateNode(5);

        BuildNodes(pNode1, pNode2, NULL);
        BuildNodes(pNode2, pNode3, pNode4);
        BuildNodes(pNode3, pNode4, NULL);
        BuildNodes(pNode4, pNode5, pNode2);

        Test("Test3", pNode1);
    }

    // 只有一个结点
    void Test4()
    {
        ComplexListNode *pNode1 = CreateNode(1);
        BuildNodes(pNode1, NULL, pNode1);

        Test("Test4", pNode1);
    }

    // 鲁棒性测试
    void Test5()
    {
        Test("Test5"NULL);
    }

    int main()
    {
        Test1();
        Test2();
        Test3();
        Test4();
        Test5();

        return 0;
    }

     
     
    运行结果:
     C++ Code 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
     
    Test1 begins:
    The original list is:
    The value of this node is: 1
    The value of its sibling is: 3

    The value of this node is: 2
    The value of its sibling is: 5

    The value of this node is: 3
    This node does not have a sibling.

    The value of this node is: 4
    The value of its sibling is: 2

    The value of this node is: 5
    This node does not have a sibling.

    The cloned list is:
    The value of this node is: 1
    The value of its sibling is: 3

    The value of this node is: 2
    The value of its sibling is: 5

    The value of this node is: 3
    This node does not have a sibling.

    The value of this node is: 4
    The value of its sibling is: 2

    The value of this node is: 5
    This node does not have a sibling.

    Test2 begins:
    The original list is:
    The value of this node is: 1
    This node does not have a sibling.

    The value of this node is: 2
    The value of its sibling is: 5

    The value of this node is: 3
    The value of its sibling is: 3

    The value of this node is: 4
    The value of its sibling is: 2

    The value of this node is: 5
    This node does not have a sibling.

    The cloned list is:
    The value of this node is: 1
    This node does not have a sibling.

    The value of this node is: 2
    The value of its sibling is: 5

    The value of this node is: 3
    The value of its sibling is: 3

    The value of this node is: 4
    The value of its sibling is: 2

    The value of this node is: 5
    This node does not have a sibling.

    Test3 begins:
    The original list is:
    The value of this node is: 1
    This node does not have a sibling.

    The value of this node is: 2
    The value of its sibling is: 4

    The value of this node is: 3
    This node does not have a sibling.

    The value of this node is: 4
    The value of its sibling is: 2

    The value of this node is: 5
    This node does not have a sibling.

    The cloned list is:
    The value of this node is: 1
    This node does not have a sibling.

    The value of this node is: 2
    The value of its sibling is: 4

    The value of this node is: 3
    This node does not have a sibling.

    The value of this node is: 4
    The value of its sibling is: 2

    The value of this node is: 5
    This node does not have a sibling.

    Test4 begins:
    The original list is:
    The value of this node is: 1
    The value of its sibling is: 1

    The cloned list is:
    The value of this node is: 1
    The value of its sibling is: 1

    Test5 begins:
    The original list is:
    The cloned list is:
    请按任意键继续. . .
  • 相关阅读:
    idea设置docker远程插件
    Linux安装nfs共享文件
    类文件注释规约
    标准pcm数据(正弦波、方波、三角波)解读
    dB分贝计算
    Ion内存的带cahce与不带cache问题分享
    c++智能指针介绍_补充
    c++智能指针介绍
    wav封装格式
    开博啦。。。
  • 原文地址:https://www.cnblogs.com/codemylife/p/3729189.html
Copyright © 2020-2023  润新知