题目描述:
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
时间限制:1秒
空间限制:32768K
思路: 题目要求不能使用到原始链表节点的引用,那么,我们就必须得生成新的链表,将数据 copy 过来就好了,时间复杂度 O(n)。
代码:
/**
* 生成一个新的结点
* @param node
* @return
*/
RandomListNode* getNode(RandomListNode* node) {
if (!node) return NULL;
RandomListNode* newNode = new RandomListNode(node->label);
return newNode;
}
/**
* 复制链表,遍历原链表,对于每个位置上的结点,生成一个数据相等的新结点
* @param pHead
* @return
*/
RandomListNode* Clone(RandomListNode* pHead) {
RandomListNode *temp = new RandomListNode(0);
RandomListNode* head = NULL;
head = temp;
while (pHead) {
RandomListNode* cur = new RandomListNode(pHead->label);
RandomListNode* random = getNode(pHead->random);
cur->random = random;
temp->next = cur;
temp = temp->next;
pHead = pHead->next;
}
return head->next;
}
注意:这里除了 next ,还有 random ,所以在处理的时候,不能直接去引用原始节点的 random,也就是说,不能写成这样:cur->random = pHead->random 而应该从新生成一个 random 节点,将其数据拷贝过来。
原题链接:
剑指offer:复杂链表的复制