public class E35CloneComplexListNode {
private static class ComplexListNode{
int value;
ComplexListNode next;
ComplexListNode sibling;
}
private static void cloneNodes(ComplexListNode head){
ComplexListNode node = head;
while (node != null){
ComplexListNode clone = new ComplexListNode();
clone.value = node.value;
clone.next = node.next;
clone.sibling = null;
node.next = clone;
node = clone.next;
}
}
private static void cloneSibling(ComplexListNode head){
ComplexListNode node = head;
ComplexListNode clone = null;
while(node != null){
clone = node.next;
if (node.sibling != null)
clone.sibling = node.sibling.next;
node = clone.next;
}
}
private static ComplexListNode refactorList(ComplexListNode head){
ComplexListNode node = head;
ComplexListNode clone = head.next;
ComplexListNode cloneHead = head.next;
while(clone != null){
node.next = clone.next;
node = node.next;
if (node == null)
break;
clone.next = node.next;
clone = clone.next;
}
return cloneHead;
}
public static ComplexListNode clone(ComplexListNode head){
if (head == null)
return null;
cloneNodes(head);
cloneSibling(head);
return refactorList(head);
}
public static void main(String[] args){
int[] sequence = {1, 2, 3, 4, 5, 6, 7, 8, 9};
ComplexListNode head = construct(sequence, 0);
ComplexListNode cloneHead = E35CloneComplexListNode.clone(head);
}
private static ComplexListNode construct(int[] sequence, int index){
if (index >= sequence.length)
return null;
ComplexListNode node = new ComplexListNode();
node.value = sequence[index];
node.next = construct(sequence, index + 1);
node.sibling = node.next;
return node;
}
}