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链接。
欢迎大家交流指正!!!