思路:O(n^2)解法超时,参考网上一个O(n)的解法先在原链表的每个节点之后插入一个相同的新节点,然后再下一次遍历的过程中,将新插入的节点(在偶数位置)的random指针赋值为前一个节点random指针所指节点的后一个位置,最后一步是恢复新旧链表(注意不能只是复原出新链表,还要保证旧链表不变,否则会有输出错误)
code:
class Solution {
public:
RandomListNode *copyRandomList(RandomListNode *head) {
if(head == NULL)
return head;
RandomListNode *newNode = nullptr, *oldP = head;
while(oldP != NULL){//每个元素插入原链表每个元素的之后
newNode = new RandomListNode(oldP->label);
newNode->next = oldP->next;
oldP->next = newNode;
oldP = newNode->next;
}
oldP = head;
while(oldP != NULL){
newNode = oldP->next;
if(oldP->random != NULL)
newNode->random = oldP->random->next;
oldP = newNode->next;
}
RandomListNode * newHead = head->next;
newNode = newHead;
oldP = head;
while(newNode != NULL){
oldP->next = newNode->next;
oldP = oldP->next;
if(oldP == NULL)
break;
newNode->next = oldP->next;
newNode = newNode->next;
}
return newHead;
}
};