复杂链表的复制
题目
请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。
剑指思路,原地修改:
第一步:复制原始链表的任意节点N并新建节点N’,再把N’连接到N的后面;
第二步:设置复制出来节点的random指针;
第三步:分割链表。
C++
/*
// Definition for a Node.
class Node {
public:
int val;
Node* next;
Node* random;
Node(int _val) {
val = _val;
next = NULL;
random = NULL;
}
};
*/
class Solution {
public:
Node* copyRandomList(Node* head) {
if(!head)
return head;
// 第一步 复制
Node* phead=head;
while(phead){
Node* temp=new Node(phead->val);
Node* p=phead->next;
phead->next=temp;
temp->next=p;
phead=p; //相当于后移两个单位
}
//第二步 处理random
phead=head;
while(phead){
Node* t=phead->next;
if(phead->random)
t->random= phead->random->next; //phead->random是原来所指的,现在有一个复制后的是其next
else
t->random=NULL;
phead=t->next;
}
//第三步 分割
phead=head;
Node* res = head->next;
Node* pres = head->next; //拷贝后的第一个节点
while(res&&res->next){
Node* old = res->next;
Node* newp = old->next;
phead->next=old;
res->next=newp;
phead = old; //原索引向后移动两个单位
res = newp; //拷贝的索引向后移动两个单位
}
if(phead)
phead->next=nullptr;
return pres;
}
};
python
"""
# Definition for a Node.
class Node:
def __init__(self, x: int, next: 'Node' = None, random: 'Node' = None):
self.val = int(x)
self.next = next
self.random = random
"""
class Solution:
def copyRandomList(self, head: 'Node') -> 'Node':
self.copyNextNode(head)
self.copyRandomNode(head)
return self.reconnectNode(head)
def copyNextNode(self,head):
node = head
while(node):
clone = Node(node.val)
clone.next = node.next
node.next = clone
node = clone.next
def copyRandomNode(self,head):
node = head
while(node):
clone = node.next
if node.random:
clone.random = node.random.next
node = clone.next
def reconnectNode(self,head):
node = head
cloneHead = None
cloneNode = None
if node:
cloneHead, cloneNode = node.next, node.next
node.next = cloneNode.next
node = node.next
# 移动时都是向后移动两个单位
while(node):
cloneNode.next = node.next
cloneNode = cloneNode.next
node.next = cloneNode.next
node = node.next
return cloneHead