class Solution {
public:
	RandomListNode* Clone(RandomListNode* pHead) {
		//hash表,用于记录旧节点对应的新节点是否已经开辟,同时建立两者的联系
		unordered_map< RandomListNode*, RandomListNode*>m;
		RandomListNode*p = pHead;
		//第一部分,首先根据next开辟所有需要的新节点
		while (p != NULL) {
			//没有新节点,那么创建一个
			if(m.count(p)==0)m[p] = new RandomListNode(p->label);
			//将next指针配好
			if (p->next == NULL)m[p]->next = NULL;
			else {
				if (m.count(p->next) == 0)m[p->next] = new RandomListNode(p->next->label);
				m[p]->next = m[p->next];
			}
			p = p->next;
		}
		//第二部分,将所有random指针连接好
		p = pHead;
		while (p != NULL) {
			if (p->random == NULL) {
				m[p]->random = NULL;
			}
			else {
				m[p]->random = m[p->random];
			}
			p = p->next;
		}

		//返回新链表的头节点
		return m[pHead];//这里就可以明显看出建立map的重要性啦,可以直接根据旧节点找到新节点
	}
};