菜鸡膜拜ORZ
// 剑指offer书上方法1:巧妙的运用哈希表在O(1)的时间对每个节点找到了random值。
public class Solution {
private Map<RandomListNode, RandomListNode> map = new HashMap<>();
public RandomListNode CloneNext(RandomListNode pHead) {
RandomListNode copyHead = new RandomListNode(pHead.label);
RandomListNode copyNode = copyHead;
map.put(pHead, copyHead);
while (pHead.next != null) {
pHead = pHead.next;
copyNode.next = new RandomListNode(pHead.label);
copyNode = copyNode.next;
map.put(pHead, copyNode);
}
return copyHead;
}
public RandomListNode CloneRandom(RandomListNode listNode, RandomListNode pHead) {
RandomListNode copyHead = listNode;
while (pHead != null) {
if (pHead.random != null) {
listNode.random = map.get(pHead.random);
}
pHead = pHead.next;
listNode = listNode.next;
}
return copyHead;
}
public RandomListNode Clone(RandomListNode pHead) {
if (pHead == null) {
return null;
}
RandomListNode copyList = CloneNext(pHead);
copyList = CloneRandom(copyList, pHead);
return copyList;
}
}
// 剑指offer书上方法2:第一步、第二步、第三部 ORZ
public class Solution {
public void CloneNodes(RandomListNode pHead) {
RandomListNode nextNode;
while (pHead != null) {
nextNode = pHead.next;
pHead.next = new RandomListNode(pHead.label);
pHead = pHead.next;
pHead.next = nextNode;
pHead = nextNode;
}
}
public void CloneRandom(RandomListNode pHead) {
while (pHead != null) {
if (pHead.random != null) {
pHead.next.random = pHead.random.next;
}
pHead = pHead.next.next;
}
}
public RandomListNode SplitList(RandomListNode pHead) {
RandomListNode copyNode = pHead.next, copyHead = copyNode, tmpNode = copyNode.next;
while (tmpNode != null) {
pHead.next = tmpNode;
pHead = pHead.next;
copyNode.next = tmpNode.next;
copyNode = copyNode.next;
tmpNode = tmpNode.next.next;
}
pHead.next = null;
return copyHead;
}
public RandomListNode Clone(RandomListNode pHead) {
if (pHead == null) {
return null;
}
CloneNodes(pHead);
CloneRandom(pHead);
return SplitList(pHead);
}
}
京公网安备 11010502036488号