138. 复制带随机指针的链表

138. 复制带随机指针的链表

给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。
要求返回这个链表的 深拷贝。
我们用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示:
val:一个表示 Node.val 的整数。
random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为 null 。


image.png

思路

本题难点是找到原始节点的random节点
1 第一遍遍历,深拷贝每一个节点,使原始节点的next指向它的深拷贝节点,深拷贝节点指向原始节点的原始next节点。这样每个原始节点的next节点都是它的深拷贝节点
即n1->n1'->n2->n2'->null
2 第二遍遍历,使深拷贝节点的random节点指向原始节点的random节点的next节点(也就是原始节点random的深拷贝节点)
3 断开两个链表

代码

class Solution {
    public Node copyRandomList(Node head) {
        if (head == null){
            return null;
        }
        //1 将所有节点,深拷贝出一个节点,放在该节点后。注意这样就可以通过p.next找到节点的深拷贝节点
        Node p = head;
        while (p != null){
            Node cp = new Node(p.val);
            cp.next = p.next;
            p.next = cp;
            p = p.next.next;
        }
        //2 给深拷贝节点的random复制
        p = head;
        while (p != null){
            if(p.random != null) {
                p.next.random = p.random.next;
            }else {
                p.next.random = null;
            }
            p = p.next.next;
        }

        //3 断开两个链表
        p = head;
        Node p2 = head.next;
        Node newHead = p.next;
        while (p2.next != null){
            p.next = p2.next;
            p = p.next;
            p2.next = p.next;
            p2 = p2.next;
        }
        p.next = null;
        return newHead;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容