题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
解题思路:
遍历节点,(创建子链)每访问一个节点A,将该节点的复制节点A’放置在A的后一个;(更新子链中random)然后重新遍历一次链表,将复制节点A’的random指针通过A.random.next进行更新;(拆分子母链),将新旧链表拆开成两个独立的链表。
Java代码
import java.util.ArrayList;
public class Solution {
public RandomListNode Clone(RandomListNode pHead){
// 三步走,复制节点,更新random节点,将新旧链表拆分
if(pHead==null) return null;
RandomListNode p=pHead;
RandomListNode q=pHead.next;
while(p!=null){
RandomListNode node=new RandomListNode(p.label);
p.next=node;
node.next=q;
p=q;
q=p.next;
}
p=pHead;
//q=pHead.next;
while(p!=null){
p.next.random= p.random==null?null:p.random.next;
p=p.next.next;
}
RandomListNode head=pHead.next;
p=pHead;
while(p!=null){
RandomListNode clone=p.next;
p.next=clone.next;
clone.next=clone.next==null?null:clone.next.next;
p=p.next;
}
return head;
}
}
Python代码:
def Clone(self, pHead):
# write code here
head = pHead
p_head = None
new_head = None
random_dic = {}
old_new_dic = {}
while head:
node = RandomListNode(head.label)
node.random = head.random
old_new_dic[id(head)] = id(node)
random_dic[id(node)] = node
head = head.next
if new_head:
new_head.next = node
new_head = new_head.next
else:
new_head = node
p_head = node
new_head = p_head
while new_head:
if new_head.random != None:
new_head.random = random_dic[old_new_dic[id(new_head.random)]]
new_head = new_head.next
return p_head