复杂链表的复制(剑指offer)
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
解法1:通过HashMap,分成两个阶段,第一各阶段就是通过next复制一条普通的链表,每次插入一个节点时,HashMap通过put原链表节点和该节点作为键值对;第二阶段实现random指针,通过遍历原链表,每次获取原链表的random节点作为键通过HashMap获取相对应的复制链表的节点,再将复制链表该节点的random设置为值。
/*
public class RandomListNode {
int label;
RandomListNode next = null;
RandomListNode random = null;
RandomListNode(int label) {
this.label = label;
}
}
*/
import java.util.HashMap;
public class Solution {
public RandomListNode Clone(RandomListNode pHead)
{
if(pHead==null){
return null;
}
RandomListNode node = pHead;
RandomListNode copyHead = new RandomListNode(node.label);
RandomListNode prenode = copyHead;
HashMap<RandomListNode,RandomListNode> map = new HashMap<RandomListNode,RandomListNode>();
map.put(node,copyHead);
node = node.next;
while(node!=null){
RandomListNode tempnode = new RandomListNode(node.label);
map.put(node,tempnode);
prenode.next = tempnode;
prenode = tempnode;
node = node.next;
}
node = pHead;
RandomListNode cpnode = copyHead;
while(node!=null){
RandomListNode tempnode = map.get(node.random);
cpnode.random = tempnode;
node = node.next;
cpnode = cpnode.next;
}
return copyHead;
}
}
解法2:第二种方法比较巧妙,同样第一步是复制原链表的各个节点不过此次复制的节点放在原链表该节点的next上,如图:
第二步设置节点的random,因为位置对应,只需将复制链表节点的random指针设置成原节点random的后一位即可,如图:
第三步按位置的奇偶分出两条链表,如图:
public class Solution {
public RandomListNode Clone(RandomListNode pHead)
{
RandomListNode node = pHead;
if(pHead==null){
return null;
}
while(node!=null){
RandomListNode copynode = new RandomListNode(node.label);
copynode.next = node.next;
node.next = copynode;
node = copynode.next;
}
node = pHead;
while(node!=null){
RandomListNode copynode = node.next;
if(node.random!=null){
copynode.random = node.random.next;
}
node = copynode.next;
}
node = pHead;
RandomListNode copyHead = node.next;
RandomListNode copynode = copyHead;
node.next = copyHead.next;
while(copynode.next!=null){
node = copynode.next;
copynode.next = node.next;
copynode = node.next;
node.next = copynode.next;
}
return copyHead;
}
}