题目:请实现函数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 2018-10-30 21:16  会飞的金鱼  阅读(124)  评论(0)    收藏  举报