class Solution {
public:
RandomListNode* Clone(RandomListNode* pHead)
{
if (pHead == nullptr)
return pHead;
// map<label, 位置>
map<int, int> imap;
int count = 0;
auto pin2 = pHead;
// 初始化
RandomListNode* head = new RandomListNode(pHead->label);
auto pin1 = head;
imap.insert(make_pair(pin2->label, count++));
while (pin2->next != nullptr){
// 插入点
auto temp = new RandomListNode(pin2->next->label);
pin1->next = temp;
pin1 = pin1->next;
pin2 = pin2->next;
// 记录值
imap.insert(make_pair(pin2->label, count++));
}
// 此时所有节点新建完成
pin1 = head;
pin2 = pHead;
while(pin2 != nullptr){
if (pin2->random != nullptr){
auto pin = head;
auto target = pin2->random->label;
auto n = imap.find(target)->second;
for (int i = n; i != 0; --i)
pin = pin->next;
// pin此时所指是pin2的random节点
pin1->random = pin;
}
pin1 = pin1->next;
pin2 = pin2->next;
}
return head;
}
};首先抒发一下自己的感想:
1、刚开始做题的时候->看了题没有思路,看了大家的思路也不会写
2、一段时间->看了题没有思路,看了大家思路后开始自己尝试写,不会的再参考
3、现在->看了题开始构思,自己实现并积极找bug
生活不易,大家砥砺前行
言归正传,本题是***复杂链表,思索后采用以下思路:
1、从头节点开始遍历,跟着->next方向建立所有的节点出来,同时用map<label, pisition>记录每个值在链表的什么位置(这里大胆假设每个节点的值都不一样,否则我也没招了,,)
2、此时有了链表雏形,接下来为每个节点链接random。也沿着老链表的->next遍历,根据每个节点->random的label锁定random节点的位置,为相应新节点建立random链接。
欢迎大家交流指正!!!

京公网安备 11010502036488号