复杂链表的复制
题目:有一个复杂链表,其结点除了有一个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); }
结果,我用断点看了一下,是正确的。