算法题|剑指 Offer 35. 复杂链表的复制

题目出处:力扣

描述:

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

示例:

---

考察如何进行深拷贝;

根据题解,解法有2种,第1种为复制后拆分,第2种为使用哈希表

思路如下:

    /*
    解法1,复制后拆分
    解法1思路如下:
    next:
    1->2->4->9->null
    random:
    1->4
    2->1
    4->1
    9->2

    1.复制链表于原链表
    next:
    1->1`->2->2`->4->4`->9->9`->null
    random:
    1->4 1`->null
    2->1 2`->null
    4->1 4`->null
    9->2 9`->null

    2.复制结点random参照原链表指向相应复制结点
    next:
    1->1`->2->2`->4->4`->9->9`->null
    random:
    1->4 1`->4`
    2->1 2`->1`
    4->1 4`->1`
    9->2 9`->2`

    3.将链表拆分成两个链表
    next:
    1->2->4->9->null
    1`->2`->4`->9`->null
    random:
    1->4 1`->4`
    2->1 2`->1`
    4->1 4`->1`
    9->2 9`->2`

    完成深拷贝
     */


    /*
    解法2 哈希表解法
    next:
    1->2->4->9->null
    random:
    1->4
    2->1
    4->1
    9->2

    1.将所有结点new一个一样的结点,存入哈希表
    hashmap:
    1-1` 2-2` 4-4` 9-9`

    2.建立指向的映射关系
    next:
    hashmap(1) -> hashmap(1.next) ---> 1` -> hashmap(4) ---> 1`->4`
    整理如下:
    1`->2`->4`->9`->null

    random:
    1`->hashmap(1.random) ---> 1`->hashmap(4) ---> 1`->4`
    2`->hashmap(2.random) ---> 2`->hashmap(1) ---> 2`->1`
    4`->hashmap(4.random) ---> 4`->hashmap(1) ---> 4`->1`
    9`->hashmap(9.random) ---> 9`->hashmap(2) ---> 9`->2`
    整理如下:
    1`->4`
    2`->1`
    4`->1`
    9`->2`

    即
    next:
    1`->2`->4`->9`->null
    random:
    1`->4`
    2`->1`
    4`->1`
    9`->2`

    完成深拷贝
     */

复制后拆分代码量比较大, 稍后再实现,先选择实现哈希表做法:

实现如下:(可以对照着上面的思路看代码实现)

    public Node copyRandomList(Node head) {
        HashMap<Node, Node> hashMap = new HashMap<>();
        Node cur = head;
        while (cur != null) {//加入哈希表中
            hashMap.put(cur, new Node(cur.val));
            cur = cur.next;
        }
        cur = head;//指针归原位
        Node tar = null;
        tar = hashMap.get(cur);
        while (cur != null){
            hashMap.get(cur).next = hashMap.get(cur.next);
            hashMap.get(cur).random = hashMap.get(cur.random);
            cur = cur.next;
        }
        return tar;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值