题目:有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。其结点的C++定义如下:请完成函数ComplexNode* Clone(ComplexNode* pHead),以复制一个复杂链表。
//复杂链表的复制
struct ComplexNode{
int m_nValue;
ComplexNode *m_pNext;
ComplexNode *m_pSibling;
};
//(1)以空间来取得效率,在O(n)时间内完成复制
ComplexNode* clone1(ComplexNode *pHead);
//(2)不消耗额外的空间,在O(n)时间内完成复制
ComplexNode* clone2(ComplexNode *pHead);
//(1)以空间来取得效率,在O(n)时间内完成复制
ComplexNode* clone1(ComplexNode *pHead){
std::map<ComplexNode*, ComplexNode*> map_node;
if(pHead == NULL) return NULL;
//第一遍先完成复制
ComplexNode* pcloneHead = NULL;
ComplexNode* pclonePre = NULL;
ComplexNode* p = pHead;
while( p != NULL ) {
ComplexNode *pcloneNode = new ComplexNode();
pcloneNode->m_nValue = p->m_nValue;
pcloneNode->m_pNext = NULL;
pcloneNode->m_pSibling = NULL;
if(pcloneHead == NULL)
pcloneHead = pclonePre = pcloneNode;
else{
pclonePre ->m_pNext = pcloneNode;
pclonePre = pcloneNode;
}
//将clone节点和原始节点形成映射
map_node.insert(std::make_pair(p, pcloneNode));
p = p->m_pNext;
}
//第二遍完成pSibling变量的赋值
p = pHead;
ComplexNode *q = pcloneHead;
while( p != NULL ) {
//假设p节点的邻接点是S,则在map中找到S节点对应的S'节点
if( p->m_pSibling != NULL)
q->m_pSibling = map_node.find(p->m_pSibling)->second;
p = p->m_pNext;
q = q->m_pNext;
}
return pcloneHead;
}
//(2)不消耗额外的空间,在O(n)时间内完成复制
ComplexNode* clone2(ComplexNode *pHead){
if( pHead == NULL ) return NULL;
ComplexNode *p = pHead;
ComplexNode *pcloneHead = NULL;
//第一遍依次在每个原始节点的后面插入一个clone节点
while( p != NULL ){
ComplexNode* pcloneNode = new ComplexNode();
pcloneNode->m_nValue = p->m_nValue;
pcloneNode->m_pNext = p->m_pNext; //clone节点连接p后一节点
pcloneNode->m_pSibling = NULL;
p->m_pNext = pcloneNode; //p节点连向当前节点
p = pcloneNode->m_pNext;
}
//第二遍赋值每一个节点的sibling 节点
p = pHead;
while( p != NULL ){
if( p->m_pSibling != NULL )
p->m_pNext->m_pSibling = p->m_pSibling->m_pNext;
p = p->m_pNext->m_pNext;
}
//第三遍分割节点
p = pHead;
pcloneHead = pHead->m_pNext;
ComplexNode* q = pcloneHead;
p = q->m_pNext;
//令q在前,p在后,先令q = p的后一节点,q 移一步;然后另p= q的后一节点,p后移一步
while( p != NULL ){
q->m_pNext = p->m_pNext;
q = q->m_pNext;
p->m_pNext = q->m_pNext;
p = p->m_pNext;
}
return pcloneHead;
}