leetcode138复制带随机指针的链表

leetcode138 Copy List with Random Pointer

Posted by BY on December 24, 2019

前言

中间又断更新。

正文

问题来源

本问题来自leetcode上的138题。

问题描述

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

示例 1:

输入:
{"$id":"1","next":{"$id":"2","next":null,"random":{"$ref":"2"},"val":2},"random":{"$ref":"2"},"val":1}

解释:
节点 1 的值是 1,它的下一个指针和随机指针都指向节点 2 。
节点 2 的值是 2,它的下一个指针指向 null,随机指针指向它自己。

分析:

用一个map来记录源节点地址和目标节点的地址,最后根据节点中存储的random指针,查询map中对应的目标节点的地址。

class Solution {
public:
    Node* copyRandomList(Node* head) {
        if (head == NULL) {
            return NULL;
        }
        map<Node*,Node*> record;
		Node *ret = new Node(head->val, NULL, head->random);
		record.insert(pair<Node*,Node*>(head, ret));
		Node *p = ret;
		//if (head != NULL) {
			head = head->next;
		//}
		while (head != NULL) {
			p->next = new Node(head->val, NULL, head->random);
			record.insert(pair<Node*,Node*>(head, p->next));
			p = p->next;
			head = head->next;
		}
		p = ret;
		while (p != NULL) {
			map<Node*,Node*>::iterator it = record.find(p->random);
			if (it != record.end()) {
				p->random = it->second;
			} else {
				p->random = NULL;
			}
			p = p->next;
		}
		return ret;
    }
};

总结:

勤思考。

结语

不管怎么样好好加油。