复杂链表的复制

题目:有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,

还有一个m_pSibling指向链表中的任一结点或者NULL。其结点的C++定义如下:
 struct ComplexNode
{
    int value;
    ComplexNode* pNext;
    ComplexNode* pSibling;
};                       

请完成函数ComplexNode* Clone(ComplexNode* pHead),以复制一个复杂链表。


思路: 一般复制一个简单链表就这么遍历一遍就好了,这个复杂链表,比简单链表多的地方就在于多了一个sibling的指针,也就是说在建立完简单链表之后,如何在新的链表中找到sibling对应的地址。我们已知的是旧的节点的地址,所以只需要用一个map,保存每一个节点旧的节点对应的新的节点的地址即可。

第一次遍历,建立简单节点,第二次遍历,对于旧链表中的每一个节点的sibling指针地址,从map中找到新链表中对应节点的地址,连接上就好了。

代码如下:

#include "stdafx.h"
#include <iostream>
#include <map>
using namespace std;

 struct ComplexNode
{
    int value;
    ComplexNode* pNext;
    ComplexNode* pSibling;
};      

 ComplexNode* Clone(ComplexNode* pHead)
 {
    if(pHead == NULL)  return NULL;
     map<ComplexNode*, ComplexNode*> pointMap;
     // newHead指向复制的新链表的开头,tail始终指向结尾
     ComplexNode* newHead,*tail;
     // 开辟一个头结点
     newHead = new ComplexNode;
     newHead->value = pHead->value;
     newHead->pNext = NULL;
     newHead->pSibling = NULL;
     // 将头结点放入map中
     pointMap[pHead] = newHead;

     tail = newHead;
     ComplexNode *p = pHead->pNext;
     // 第一遍先将简单链表复制一下
     while(p != NULL)
     {
        ComplexNode* newNode = new ComplexNode;
        newNode->value = p->value;
        newNode->pNext = NULL;
        newNode->pSibling = NULL;

        tail->pNext = newNode;
        tail = newNode;
        pointMap[p] = newNode;
         p = p->pNext;
     }

     // 根据map中保存的数据,找到对应的节点
     p = pHead;
     tail = newHead;
     while(p!=NULL)
     {
         if(p->pSibling!=NULL)
         {
             tail->pSibling = pointMap.find(p->pSibling)->second;
         }
         p = p->pNext;
         tail  = tail->pNext;
     }
    return newHead;
 }

 void deleteList(ComplexNode* pHead)
 {
    while(pHead!=NULL)
    {
        ComplexNode* pNext = pHead->pNext;
        delete pHead;
        pHead = pNext;
    }
 
 }

int main()
{
    ComplexNode* p1 = new ComplexNode;
    ComplexNode* p2 = new ComplexNode;
    ComplexNode* p3 = new ComplexNode;
    ComplexNode* p4 = new ComplexNode;
    p1->pNext = p2; p2->pNext = p3; 
    p3->pNext = p4; p4->pNext = NULL;
    p1->value = 1 ; p2->value = 2;
    p3->value = 3 ; p4->value = 4;
    p1->pSibling = p3;p2->pSibling = p4;
    p3->pSibling = NULL; p4->pSibling = NULL;

    ComplexNode* newHead = Clone(p1);

    deleteList(newHead);
    deleteList(p1);

}

结果,我用断点看了一下,是正确的。

posted @ 2012-10-28 12:27  三更_雨  阅读(1066)  评论(0编辑  收藏  举报