面试题35:复杂链表的复制
题目:请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表。在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling 指向链表中的任意结点或者nullptr。
解决方案:
第一步:复制原始链表的任意节点N并创建新节点N’,再把N’链接到N的后面。
第二步:如果原始链表上的节点N的 sibling 指向S,则对应的复制节点N’的 sibling 指向S的复制节点S’。
第三步:把第二步得到的链表拆分成两个链表,奇数位置上的节点组成原始链表,偶数位置上的节点组成复制出来的链表。
#include<iostream>
using namespace std;
struct ComplexListNode {
int value;
ComplexListNode* next;
ComplexListNode* sibling;
};
// 1、复制原始链表的任意节点N并创建新节点N',再把N'链接到N的后面。
void CloneNodes(ComplexListNode* pHead){
ComplexListNode* pNode=pHead;
while(pNode!=NULL){
ComplexListNode* pCloned=new ComplexListNode();
pCloned->value=pNode->value;
pCloned->next=pNode->next;
pCloned->sibling=NULL;
pNode->next=pCloned;
pNode=pCloned->next;
}
}
// 2、如果原始链表上的节点N的 sibling 指向S,则对应的复制节点N'的 sibling 指向S的复制节点S'。
void ConnectSiblingNodes(ComplexListNode* pHead){
ComplexListNode* pNode=pHead;
while(pNode!=NULL){
ComplexListNode* pCloned=pNode->next;
if(pNode->sibling!=NULL){
pCloned->sibling=pNode->sibling->next;
}
pNode=pCloned->next;
}
}
// 3、 把第二步得到的链表拆分成两个链表,奇数位置上的节点组成原始链表,偶数位置上的节点组成复制出来的链表。
ComplexListNode* ReconnectNodes(ComplexListNode* pHead){
ComplexListNode* pNode=pHead;
ComplexListNode* pClonedHead=NULL;
ComplexListNode* pClonedNode=NULL;
if(pNode!=NULL){
pClonedHead=pClonedNode=pNode->next;
pNode->next=pClonedNode->next;
pNode=pNode->next;
}
while(pNode!=NULL){
pClonedNode->next=pNode->next;
pClonedNode=pClonedNode->next;
pNode->next=pClonedNode->next;
pNode=pNode->next;
}
return pClonedHead;
}
ComplexListNode* Clone(ComplexListNode* pHead){
CloneNodes(pHead);
ConnectSiblingNodes(pHead);
ReconnectNodes(pHead);
}
int main() {
return 0;
}