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){
//复制原链表的sibling指针
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);
}
//构造一个sibling指向下一个节点的复杂链表用于测试
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;
}
}
复杂链表的复制(Java实现)
最新推荐文章于 2023-03-27 16:37:20 发布