题目:请实现函数ComplexListNode clone(ComplexListNode pHead),复制一个复杂链表。每个结点除了有一个指针指向下一个结点外,还有一个指向链表中的任意结点或者null。

1)根据原始链表的每个结点N创建对应的N'。把N'链接在N的后面。

2)设置复制出来的结点的Sibling.假设原始链表上的N的Sibling指向结点S,那么其对应复制出来的N'是N的Next指向的结点,同样S'也是S的Next指向的结点。

3)把这个长链表拆分成两个链表:把奇数位置的结点用Next链接起来就是原始链表,把偶数位置的结点用Next链接起来就是复制出来的链表。

代码实现:
public class ComplexListNode{ char value; ComplexListNode next=null; ComplexListNode sibling=null; public ComplexListNode(){ } public ComplexListNode(char data){ this.value=data; } public String toString(){ ComplexListNode node=this; String str=""; while(node!=null){ str=str+" "+node.value+" "; if(node.sibling!=null){ str=str+"sibling:"+node.sibling.value+" "; } node=node.next; } return str; } }
public class Solution{ public static void cloneNodes(ComplexListNode pHead){ ComplexListNode pNode=pHead; while(pNode!=null){ ComplexListNode pCloned=new ComplexListNode(); pCloned.value=pNode.value; pCloned.next=pNode.next; pCloned.sibling=null; pNode.next=pCloned; pNode=pCloned.next; } } public static void connectSiblingNodes(ComplexListNode pHead){ ComplexListNode pNode=pHead; while(pNode!=null){ ComplexListNode pCloned=pNode.next; if(pNode.sibling!=null){ pCloned.sibling=pNode.sibling.next; } pNode=pCloned.next; } } public static ComplexListNode reconnectNodes(ComplexListNode pHead){ ComplexListNode pNode=pHead; ComplexListNode pClonedHead=null; ComplexListNode pClonedNode=null; if(pNode!=null){ pClonedNode=pNode.next; pClonedHead=pClonedNode; pNode.next=pClonedNode.next; pNode=pNode.next; } while(pNode!=null){ pClonedNode.next=pNode.next; pClonedNode=pClonedNode.next; pNode.next=pClonedNode.next; pNode=pNode.next; } return pClonedHead; } public static ComplexListNode clone(ComplexListNode pHead){ cloneNodes(pHead); connectSiblingNodes(pHead); return reconnectNodes(pHead); } public static void main(String[] args){ ComplexListNode node1=new ComplexListNode('A'); ComplexListNode node2=new ComplexListNode('B'); ComplexListNode node3=new ComplexListNode('C'); ComplexListNode node4=new ComplexListNode('D'); ComplexListNode node5=new ComplexListNode('E'); node1.next=node2; node2.next=node3; node3.next=node4; node4.next=node5; node1.sibling=node3; node2.sibling=node5; node4.sibling=node2; System.out.println(node1.toString()); ComplexListNode node=clone(node1); System.out.println(node); } }
posted on
浙公网安备 33010602011771号