【Leetcode】Copy List with Random Pointer

来源:互联网 发布:施乐s1810网络设置 编辑:程序博客网 时间:2024/04/25 16:59

A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.

Return a deep copy of the list.

题意:存在一个链表,里面有两个指针,一个指针指向下一节点,另一指针指向链表的任意节点或者NULL,要求是深复制一个完全一样的链表并返回。

思路:此题一开始的思路是先遍历链表,遍历一个节点新建一个节点,然后可以指定next指针,当整个链表都完成初始化后,再新旧两个表逐个遍历random指针,这样可以实现所要的功能,但是超时了。

后来没想到什么好的方式,就查了一下资料,发现可以这样做,如图:

然后在上图的基础上进行如下两步

1、构建新链表的random指针:比如new1->random = new1->random->random->next, new2->random = NULL, new3-random = NULL, new4->random = new4->random->random->next

2、恢复原始链表:根据最开始保存的原始链表next指针映射关系恢复原始链表

该算法时间空间复杂度均为O(N)。

为了保存最初的链表顺序,声明了一个vector,用于指定恢复原始链表。代码如下:

/** * Definition for singly-linked list with a random pointer. * struct RandomListNode { *     int label; *     RandomListNode *next, *random; *     RandomListNode(int x) : label(x), next(NULL), random(NULL) {} * }; */class Solution {public:    RandomListNode *copyRandomList(RandomListNode *head) {        if(head==NULL)            return NULL;        RandomListNode *Head = new RandomListNode(head->label);        RandomListNode *p = head;        RandomListNode *q = Head;        vector<RandomListNode*> backup;        backup.push_back(p);        while(p->next)        {            RandomListNode *temp = p;            p = p->next;            backup.push_back(p);            RandomListNode *node=new RandomListNode(p->label);            temp->next = q;            q->next = node;            q->random = temp;            q = node;        }        p->next = q;        q->random = p;        q = Head;        while(q)        {            if(q->random->random)                q->random = q->random->random->next;            else                q->random = NULL;            q = q->next;        }        for(int i=0;i<backup.size()-1;i++)        {            backup[i]->next = backup[i+1];        }        backup[backup.size()-1]->next = NULL;        return Head;    }};


0 0