原博客地址:http://blog.csdn.net/u011116672/article/details/50236397
思路:
Step1:遍历一遍链表,用nextPointer指针将链表连起来的同时,将原链表中的结点N和相应复制结点N’建立HashMap<N,N'>
Step2:再次遍历一遍原链表,对于每一结点p通过HashMap找到p’,并在原链表中找到p的magicPointer所指向结点,再次通过哈希查找找到p’的magicPointer指针应指向的结点,并修改p’的magicPointer指针
时间代价为O(n), 空间代价为O(n)
public class CopyComplicateLinkedList {
static class RandomListNode {
int label;
RandomListNode next = null;
RandomListNode random = null;
RandomListNode(int label) {
this.label = label;
}
}
public RandomListNode Clone(RandomListNode pHead) {
CloneNodes(pHead);
ConnectSiblingNodes(pHead);
return ConnectFinalListNodes(pHead);
}
// 第一步:复制链表节点
private void CloneNodes(RandomListNode pHead) {
RandomListNode node = pHead;
while (node != null) {
RandomListNode cloneNode = new RandomListNode(node.label);
cloneNode.next = node.next;
cloneNode.random = null;
node.next = cloneNode;
node = cloneNode.next;
}
}
// 第二步:设置每个节点的随机指针
private void ConnectSiblingNodes(RandomListNode pHead) {
RandomListNode node = pHead;
while (node != null) {
RandomListNode clone = node.next;
if (node.random != null) {
clone.random = node.random.next;
}
node = clone.next;
}
}
// 第三步:组合复制的节点
private RandomListNode ConnectFinalListNodes(RandomListNode pHead) {
RandomListNode node = pHead;
RandomListNode cloneHead = null;
RandomListNode cloneNode = null;
// 设置第一个节点
if (node != null) {
cloneHead = node.next;
cloneNode = node.next;
node.next = cloneNode.next;
node = node.next;
}
while (node != null) {
cloneNode.next = node.next;
cloneNode = cloneNode.next;
node.next = cloneNode.next;
node = node.next;
}
return cloneHead;
}
public static void main(String[] args) {
RandomListNode pHead = new RandomListNode(1);
RandomListNode node1 = new RandomListNode(2);
RandomListNode node2 = new RandomListNode(3);
RandomListNode node3 = new RandomListNode(4);
RandomListNode node4 = new RandomListNode(5);
RandomListNode node5 = new RandomListNode(6);
RandomListNode node6 = new RandomListNode(7);
RandomListNode node7 = new RandomListNode(8);
pHead.next = node1;
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
node5.next = node6;
node6.next = node7;
pHead.random = node4;
node2.random = node6;
@SuppressWarnings("unused")
RandomListNode node = new CopyComplicateLinkedList().Clone(pHead);
System.out.println(node);
}
}