复杂链表的复制

来源:互联网 发布:网络视频产业发展趋势 编辑:程序博客网 时间:2024/05/19 02:21

  问题:请实现函数ComplexListNode* Clone(ComplexListNode* pHead)复制一个复杂链表。(分解让复杂的问题简单化)结点的C++定义如下:

   struct   ComplexListNode

 {

          int          m_nValue;

         ComplexListNode*   m_pNext;

         ComplexListNode*    m_pSibling; 

  };

解法的思想如下:

     第一步:根据原始链表的每个结点N创建对应的N*;


     第二步: 设置复制出来的结点的m_pSibling;


     第三步:把这个长链表拆分成两个链表。



详细的实现代码如下:

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)    {        printf("The value of this node is: %d.\n", pNode->m_nValue);        if(pNode->m_pSibling != NULL)            printf("The value of its sibling is: %d.\n", pNode->m_pSibling->m_nValue);        else            printf("This node does not have a sibling.\n");        printf("\n");        pNode = pNode->m_pNext;    }}
#include "stdafx.h"#include "ComplexList.h"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:\n", testName);    printf("The original list is:\n");    PrintList(pHead);    ComplexListNode* pClonedHead = Clone(pHead);    printf("The cloned list is:\n");    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 _tmain(int argc, _TCHAR* argv[]){    Test1();    Test2();    Test3();    Test4();    Test5();    return 0;}



0 0
原创粉丝点击