剑指Offer-25.复杂链表的复制(Javascript)

25.复杂链表的复制

《剑指Offer》刷题GitHub链接

题目链接

题目描述

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)

解题思路

此题有两种方法:

  1. 采用递归,每次将.next作为参数递归,.next为下一个"pHead"

  2. 不采用递归

    • 复制每个节点,并插入到原节点后面,如:复制节点A得到A1,将A1插入节点A后面
    • 遍历链表,将每一个clone节点的random指向对应的random的clone节点(代码里有细节),A1->random = A->random->next;
    • 将链表拆分成原链表和复制后的链表(借用tmp临时变量)

Code

  • 方法一
/*function RandomListNode(x){
    this.label = x;
    this.next = null;
    this.random = null;
}*/

function Clone(pHead)
{
    // write code here
    if (!pHead) {
        return null;
    }
    // 复制头结点
    var node = new RandomListNode(pHead.label);
    node.random = pHead.random;
    // 递归其他节点
    node.next = Clone(pHead.next);
    return node;
}
  • 方法二
/*function RandomListNode(x){
    this.label = x;
    this.next = null;
    this.random = null;
}*/

function Clone(pHead)
{
    // write code here
    if(pHead === null){
        return;
    }
    //复制
    var currNode = pHead;
    while(currNode){
        //new一个RandomListNode,生成的才是对象,如果没有new,相当于rename了RandomListNode
        var node = new RandomListNode(currNode.label);
        node.next = currNode.next;
        currNode.next = node;
        currNode = node.next;
    }
    //改random
    currNode = pHead;
    while(currNode){
        node = currNode.next;
        //若random有值,则node的random值为currNode.random的复制节点(因为后面要拆出来,所以一定是复制节点)
        if(currNode.random){
            node.random = currNode.random.next;
        }
        //currNode为最初的链表的下一个元素,即现(复制后的)链表的下下个元素curr.next.next,即node.next
        currNode = node.next;
    }
    //拆分
    var cloneHead = pHead.next;
    var tmp;
    currNode = pHead;
    while(currNode.next){
        tmp = currNode.next;
        currNode.next = tmp.next;
        currNode = tmp;
    }
    return cloneHead;
}

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