题目:
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
题目解析已经写到注释里面了,这里面写的时候一定要细心哟
/*
struct RandomListNode {
int label;
struct RandomListNode *next, *random;
RandomListNode(int x) :
label(x), next(NULL), random(NULL) {
}
};
*/
//复杂链表的复制:
//复制每一个节点,将新节点插入到当前节点的后面
//负责所有的random,将含有random的节点的下一个节点的random设置为random的下一个节点。
//用两个指针,用于将该复杂链表拆分成两个
class Solution {
public:
RandomListNode* Clone(RandomListNode* pHead)
{
if(pHead == nullptr) return nullptr;
//复制每一个节点
RandomListNode* pNode = pHead;
while(pNode!= nullptr) {
RandomListNode* pTemp = new RandomListNode(pNode->label);
pTemp->next = pNode->next;
pTemp->random = nullptr;
pNode->next = pTemp;
pNode = pTemp->next;
}
// 复制random指针
pNode = pHead;
while(pNode!= nullptr){
RandomListNode* pp = pNode->next;
if(pNode->random!=nullptr) {
pp ->random = pNode->random->next;
}
pNode = pp->next;
}
RandomListNode* pTemp = nullptr;
RandomListNode* pHeadTemp = nullptr;
pNode = pHead;
pTemp = pHeadTemp = pHead->next;
pNode->next = pTemp->next;
pNode = pNode->next;
while(pNode != nullptr){
pTemp -> next = pNode->next;
pTemp = pTemp->next;
pNode->next = pTemp->next;
pNode = pNode->next;
}
return pHeadTemp;
}
};