剑指offer26,复杂链表的复制(java实现)

具体题目参照牛客。

 

/**
 * 题目:复杂链表的复制
 * int label;
    RandomListNode next = null;
    RandomListNode random = null;

    RandomListNode(int label) {
        this.label = label;
    }
 * @author lenovo047
 *
 */
public class test26 {
    
    /*
     * 总程序,里面分三步
     */
    public RandomListNode Clone(RandomListNode pHead)
    {
        cloneNodes(pHead);
        connectRandom(pHead);
        return reconnect(pHead);
    }
    
    /*
     * 第一步,正常链表的复制
     */
    void cloneNodes(RandomListNode head){
        RandomListNode node = head;
        while(node != null){
            RandomListNode clone = new RandomListNode(0);  
            clone.label = node.label;//赋值
            clone.next = node.next;
            node.next = clone;
            clone.random = null;
            
            node = clone.next;
        }
    }
    /*
     * random的连接
     */
    void connectRandom(RandomListNode head){
        RandomListNode node = head;
        while(node != null){
            RandomListNode clone = node.next;
            if(node.random != null){
                clone.random = node.random.next;
            }
            node = clone.next;
        }
    }
    
    /*
     * 将上边两步构造好的链表拆分
     */
    RandomListNode reconnect(RandomListNode head){
        RandomListNode node = head;
        RandomListNode cloneHead = null;
        RandomListNode cloneNode = null;
                
        if(node != null){
            cloneHead = cloneNode = head.next; //将复制的那个链表的头结点初始化

            node.next = cloneNode.next;  //主链表的指针指向自己的结点
            node = node.next;
        }        
        while(node != null){
            cloneNode.next = node.next;   //改变复制链表的指针
            cloneNode = cloneNode.next;
            
            node.next = cloneNode.next;  //主链表的指针指向自己的结点
            node = node.next;
        }
        return cloneHead;
    }
    
    

}
 

你可能感兴趣的:(剑指offer)