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

题目描述:

原题链接

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

思路:

这题多了一个 random节点 ,所以需要 2次遍历链表,

因为 第一次 如果某个节点的 random 指针指向的节点还没创建出来,那么random 就无法正确的指向。

我们可以先把复制的节点放在原链表节点的后面,然后,等所有节点都复制完毕后,再遍历一次,进行 random 指针的指向,然后再将 2 个链表拆分开即可。

总共遍历了 三次链表,时间复杂度为 O(N)

代码:

class Solution {
    public Node copyRandomList(Node head) {
        if(head==null) return head;

        Node cur=head;
        while(cur!=null){
            Node temp=new Node(0);
            temp.val=cur.val;
            temp.next=cur.next;
            cur.next=temp;
            cur=cur.next.next;
        }

        cur=head;
    
        while(cur!=null){
            if(cur.random!=null){
                cur.next.random=cur.random.next;
            }
            cur=cur.next.next;
        }

        Node res=new Node(-1);
        Node tail=res;
        cur=head;
        while(cur!=null){
            tail.next=cur.next;
            tail=tail.next;
            cur.next=cur.next.next;
            cur=cur.next;
        }
        return res.next;
    

    }
}
posted @ 2023-05-12 20:35  溯光6  阅读(3)  评论(0编辑  收藏  举报