题目描述:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
1. 用C++写出逻辑
RandomListNode* Clone(RandomListNode* pHead) {
CloneNodes(pHead);
connectCloneNode(pHead);
return reconnectNode(pHead);
}
//step1 克隆节点
void CloneNodes(RandomListNode* pHead){
RandomListNode* node = pHead;
while(node != nullptr){
RandomListNode* cloneNode = new RandomListNode(0);
cloneNode -> next = node -> next;
cloneNode -> label = node -> label;
cloneNode -> random = nullptr;
node -> next = cloneNode;
node = cloneNode -> next;
}
}
void connectCloneNode(RandomListNode* pHead){
RandomListNode* node = pHead;
while(node != nullptr){
RandomListNode* cloneNode = node -> next;
if(node -> random != nullptr)
cloneNode -> random = node -> random -> next;
node = cloneNode -> next;
}
}
RandomListNode* reconnectNode(RandomListNode* pHead){
RandomListNode* node = pHead;
RandomListNode* pClonedHead = nullptr;
RandomListNode* pClonedNode = nullptr;
if( node != nullptr){
pClonedHead = pClonedNode = pHead -> next;
node -> next = pClonedNode -> next;
node = node -> next;
}
while(node != nullptr){
pClonedNode -> next = node -> next;
pClonedNode = pClonedNode -> next;
node -> next = pClonedNode -> next;
node = node -> next;
}
return pClonedHead;
}