题目描述:
请实现函数ComplexListNode Clone(ComplexListNode head),复制一个复杂链表。在复杂链表中,每个结点除了有一个Next指针指向下一个结点外,还有一个Sibling指向链表中的任意结点或者NULL。下图是一个含有5个结点的复杂链表。图中实线箭头表示m_pNext指针,虚线箭头表示m_pSibling指针。为简单起见,指向NULL的指针没有画出。
解题思路:
Demo:
/*
struct RandomListNode {
int label;
struct RandomListNode *next, *random;
RandomListNode(int x) :
label(x), next(NULL), random(NULL) {
}
};
*/
class Solution {
public:
RandomListNode* Clone(RandomListNode* pHead)
{
if(!pHead) return nullptr;
RandomListNode *currNode = pHead;
// 复制并插入每个节点,如:复制节点A得到A1,将A1插入节点A后面
while(currNode)
{
RandomListNode *node = new RandomListNode(currNode->label);
node->next = currNode->next;
currNode->next = node;
currNode = node->next;
}
// 根据旧链表的兄弟结点初始化新链表的兄弟结点,A1->random = A->random->next;
currNode = pHead;
while(currNode)
{
RandomListNode *node = currNode->next;
if (currNode->random)
node->random = currNode->random->next;
currNode = node->next;
}
// 将链表拆分成原链表和复制后的链表
RandomListNode *pCloneHead = pHead->next;
// 不能破坏原链表的结构,所以用临时变量保存
RandomListNode *tmp = pCloneHead;
currNode = pHead;
while(tmp->next)
{
// 找到两个结点的下一个结点
currNode->next = tmp->next;
tmp->next = tmp->next->next;
// 更新两个结点
currNode = currNode->next;
tmp = tmp->next;
}
currNode->next = nullptr;
return pCloneHead;
}
};