复制带随机指针的链表-LeetCode

复制带随机指针的链表

问题描述

给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。
要求返回这个链表的深拷贝。

示例:

在这里插入图片描述

  输入:
    {"$id":"1","next":{"$id":"2","next":null,"random":{"$ref":"2"},"val":2},"random":{"$ref":"2"},"val":1}
    
    解释:
    节点 1 的值是 1,它的下一个指针和随机指针都指向节点 2 。
    节点 2 的值是 2,它的下一个指针指向 null,随机指针指向它自己。

提示:

你必须返回给定头的拷贝作为对克隆列表的引用。

解题思路

1、将原链表复制成如下链表
在这里插入图片描述
2、蓝色.random指向前一个结点的random的next
3、分割链表

注意:分割链表是将原链表保持原样

代码实现

/*
class Node {
    public int val;
    public Node next;
    public Node random;

    public Node() {}

    public Node(int _val,Node _next,Node _random) {
        val = _val;
        next = _next;
        random = _random;
    }
}*/
class Solution {
    
   public Node copyRandomList(Node head) {
        if(head==null){
            return null;
        } 
        Node cur=head;
        Node newHead=null;
        //将每个结点复制链接起来
        while(cur!=null){
            Node node=new Node(cur.val,cur.next,null);
            cur.next=node;
            cur=cur.next.next;
        }
        //链接每个新结点的random
        cur=head;
        while(cur!=null){
            if(cur.random==null){
                cur.next.random=null;
            }else{
                cur.next.random=cur.random.next;
            }
            cur=cur.next.next;
        }
        //分割链表
        newHead=head.next;
        cur=head;
        Node newCur=newHead;
        while(newCur.next!=null){
            cur.next=newCur.next;
            newCur.next=newCur.next.next;
            cur=cur.next;
            newCur=newCur.next;
        }
        //最后将原链表的末尾指向原来的末尾
        cur.next=newCur.next;
        return newHead;
    }
}
发布了149 篇原创文章 · 获赞 137 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/zhang_ye_ye/article/details/98771999