剑指 Offer 35. 复杂链表的复制

题目

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。

示例

剑指 Offer 35. 复杂链表的复制

 

输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]

答案1(Map)

/**
 * // Definition for a Node.
 * function Node(val, next, random) {
 *    this.val = val;
 *    this.next = next;
 *    this.random = random;
 * };
 */

/**
 * @param {Node} head
 * @return {Node}
 */
var copyRandomList = function(head) {
    let map=new Map;
    let node=head;
    while(node!=null)
    {
        map.set(node,new Node(node.val));//Map.set(key,value)
        node=node.next;
    }
    node=head;
    while(node!=null){
        map.get(node).next=map.get(node.next) === undefined ? null : map.get(node.next);//map.get(key)拿到value
        map.get(node).random=map.get(node.random);
        node=node.next;
    }
    return map.get(head);
};

答案2(拼接+拆分)

/**
 * // Definition for a Node.
 * function Node(val, next, random) {
 *    this.val = val;
 *    this.next = next;
 *    this.random = random;
 * };
 */

/**
 * @param {Node} head
 * @return {Node}
 */
var copyRandomList = function(head) {
    if(!head) return head;
    let node=head;
    //创建新节点
    while(node!=null)
    {
        node.next=new Node(node.val,node.next);
        node=node.next.next;
    }
    //设置新节点的next
    node=head;
    while(node){
        if(node.random!=null){
            node.next.random=node.random.next;
        }
        node=node.next.next;
    }
    node=head;
    let ans=head.next;
    let newnode=head.next;
    while(node.next&&newnode.next)
    {
        node.next=node.next.next;
        newnode.next=newnode.next.next;
        node=node.next;
        newnode=newnode.next;
    }
    node.next=null;
    newnode.next=null;
    return ans;
};

上一篇:设置与查看Linux系统中的环境变量


下一篇:35.搜索插入位置