输入一个复杂链表(每一个节点中有节点值,以及两个指针,一个指向下一个节点,另外一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,不然判题程序会直接返回空)java
解析:见代码node
代码:dom
①用map保存复制的新的节点this
/*
public class RandomListNode {
int label;
RandomListNode next = null;
RandomListNode random = null;指针
RandomListNode(int label) {
this.label = label;
}
}
*/
import java.util.*;get
public class Solution {
public RandomListNode Clone(RandomListNode pHead)
{
HashMap<RandomListNode,RandomListNode> map = new HashMap<>();
RandomListNode p = pHead;
//第一次遍历,保存新的节点;至关于复制
while(p != null){
RandomListNode newNode = new RandomListNode(p.label);
map.put(p,newNode);
p = p.next;
}
p = pHead;
//第二次遍历,将原映射复制到新的节点中
while(p != null){
RandomListNode node = map.get(p);
node.next = (p.next == null)? null:map.get(p.next);
node.random = (p.random == null) ? null:map.get(p.random);
p = p.next;
}
return map.get(pHead);
}
}io
*********************************************************************************************************************class
②在原表中复制import
/*
public class RandomListNode {
int label;
RandomListNode next = null;
RandomListNode random = null;List
RandomListNode(int label) { this.label = label; } } */ public class Solution { public RandomListNode Clone(RandomListNode pHead) { if(pHead == null){ return null; } RandomListNode currentNode = pHead; //复制每一个节点,将复制节点插入到原节点的后边 while(currentNode != null){ //复制A节点 RandomListNode cloneNode = new RandomListNode(currentNode.label); //得到B节点 RandomListNode nextNode = currentNode.next; //A节点指向复制节点 currentNode.next = cloneNode; //复制节点指向B节点 cloneNode.next = nextNode; //由A节点移到B节点 currentNode = nextNode; } //复制映射关系 currentNode = pHead; while(currentNode != null){ currentNode.next.random = currentNode.random == null? null:currentNode.random.next; currentNode = currentNode.next.next; } //拆分,拆除复制结果 currentNode = pHead; RandomListNode pCloneNode = pHead.next; while(currentNode != null){ //复制节点 RandomListNode cloneNode = currentNode.next; //更新原节点的next currentNode.next = cloneNode.next; //更新复制节点next cloneNode.next = cloneNode.next == null? null : cloneNode.next.next; //更新原节点指针 currentNode = currentNode.next; } return pCloneNode; } }