题目:请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表。在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling 指向链表中的任意结点或者nullptr。
#include<iostream>
using namespace std;
//链表结构
struct ComplexListNode
{
int val;
ComplexListNode* next;
ComplexListNode* Sibling;
};
//创建链表结点
ComplexListNode* CreateNode(int val)
{
ComplexListNode* pNode = new ComplexListNode();
pNode->val = val;
pNode->next = nullptr;
pNode->Sibling = nullptr;
return pNode;
}
//链接链表
void ConnectList(ComplexListNode* pNode, ComplexListNode* next, ComplexListNode* Sibling)
{
if (pNode != nullptr)
{
pNode->next = next;
pNode->Sibling = Sibling;
}
}
//打印链表
void PrintList(ComplexListNode* pHead)
{
ComplexListNode* pNode = pHead;
while (pNode != nullptr)
{
printf("The value of this node is:%d\n", pNode->val);
if (pNode->Sibling != nullptr)
printf("The value of its sibling is :%d\n", pNode->Sibling->val);
else
printf("This node does not have a sibling.\n");
printf("\n");
pNode = pNode->next;
}
}
//在一个链表的每一个结点后面复制一个结点,比如:A->A'->B->B'->C->C'
void CloneNode(ComplexListNode* pHead)
{
ComplexListNode* pNode = pHead;
while (pNode != nullptr)
{
ComplexListNode* pCloned = new ComplexListNode();
pCloned->val = pNode->val;
pCloned->next = pNode->next;
pNode->next = pCloned;
pNode = pCloned->next;
}
}
//把复制的结点的Sibling连接起来(Sibling为链表结点的下一个随机结点)
void ConnectSiblingNodes(ComplexListNode* pHead)
{
ComplexListNode* pNode = pHead;
while (pNode != nullptr)
{
ComplexListNode* pCloned = pNode->next;
if (pNode->Sibling != nullptr)
{
pCloned->Sibling = pNode->Sibling->next;
}
pNode = pCloned->next;
}
}
//把原链表和复制链表分离,最终返回复制链表头
ComplexListNode* ReconnectNodes(ComplexListNode* pHead)
{
ComplexListNode* pNode = pHead;
ComplexListNode* pClonedNode = nullptr;
ComplexListNode* pClonedHead = nullptr;
if (pNode != nullptr)
{
pClonedHead = pClonedNode = pNode->next;
pNode->next = pClonedNode->next;
pNode = pNode->next;
}
while (pNode != nullptr)
{
pClonedNode->next = pNode->next;
pClonedNode = pClonedNode->next;
pNode->next = pClonedNode->next;
pNode = pNode->next;
}
return pClonedHead;
}
int main()
{
ComplexListNode* pNode1 = CreateNode(1);
ComplexListNode* pNode2 = CreateNode(2);
ComplexListNode* pNode3 = CreateNode(3);
ComplexListNode* pNode4 = CreateNode(4);
ComplexListNode* pNode5 = CreateNode(5);
ConnectList(pNode1, pNode2, pNode4);
ConnectList(pNode2, pNode3, pNode4);
ConnectList(pNode3, pNode4, pNode1);
ConnectList(pNode4, pNode5, pNode2);
CloneNode(pNode1);
ConnectSiblingNodes(pNode1);
ComplexListNode* pClonedHead = ReconnectNodes(pNode1);
PrintList(pClonedHead);
return 0;
}