题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
牛客链接:
https://www.nowcoder.com/practice/f836b2c43afc4b35ad6adc41ec941dba?tpId=13&&tqId=11178&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
解题思路
具体可分为三步:
- 把复制的结点链接在原始链表的每一对应结点后面
- 把复制的结点的random指针指向被复制结点的random指针的下一个结点
- 拆分成两个链表,奇数位置为原链表,偶数位置为复制链表
代码
class Solution {
public:
RandomListNode* Clone(RandomListNode* pHead)
{
if (pHead == NULL)
return NULL;
//复制节点并关联到原节点
RandomListNode* pTemp = pHead;
while(pTemp != NULL) {
//申请新空间复制节点
RandomListNode* pClone = new RandomListNode(pTemp->label);
pClone->next = pTemp->next;
pClone->random = NULL;
//关联新节点到原节点
pTemp->next = pClone;
pTemp = pClone->next;
}
//处理random指针
pTemp = pHead;
while(pTemp != NULL) {
RandomListNode* pClone = pTemp->next;
if (pTemp->random != NULL) {
pClone->random = pTemp->random->next;
}
pTemp = pClone->next;
}
//将链表拆分成新链表和原链表
RandomListNode* pResHead = pHead->next;
pTemp = pHead;
RandomListNode* pTemp1 = NULL;
while(pTemp != NULL) {
pTemp1 = pTemp->next;
pTemp->next = pTemp1 == NULL? NULL:pTemp1->next;
pTemp = pTemp1;
}
return pResHead;
}
};
参考链接:
https://www.nowcoder.com/questionTerminal/f836b2c43afc4b35ad6adc41ec941dba