描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)。 下图是一个含有5个结点的复杂链表。图中实线箭头表示next指针,虚线箭头表示random指针。为简单起见,指向null的指针没有画出。
对于每一个节点,创建一个辅助节点,比如1-2-3-4-null,就变成1-1-2-2-3-3-4-4-null,然后第一个节点的random节点的后一个节点就是就是第一个节点后一个节点的random,例如1的random是第一个3节点,然后1节点后面的节点1'的random节点就在第一个3节点的后面3',最后再把两个链表拆分开来就可以了
java代码
public RandomListNode Clone(RandomListNode head) {
if(head==null)return null;
for(RandomListNode node=head;node!=null;node=node.next.next){
RandomListNode newNode=new RandomListNode(node.label);
newNode.next=node.next;
node.next=newNode;
}
for (RandomListNode node=head;node!=null;node=node.next.next){
RandomListNode newNode=node.next;
newNode.random=(node.random!=null)?node.random.next:null;
}
RandomListNode newHead=head.next;
for (RandomListNode node=head;node!=null;node=node.next){
RandomListNode newNode=node.next;
node.next=node.next.next;
newNode.next=(newNode.next!=null)?newNode.next.next:null;
}
return newHead;
}
此题还可以通过hash表的方法节答,第一次复制链表的时候只复制next节点,然后把每个节点存在hashmap中,然后再次遍历random节点与map中存储的节点比较就能知道random是哪个节点了,代码这边就不写了,有兴趣的可以自己尝试。