分成三步,1.建立新的结点,插入到原结点的后面。2.将原结点的random复制给新的结点,注意复制的时候是让新结点的random指向新的结点。3.将新的结点从原链表中分离出来
假设原来的链表是 A->B->C->D(忽略random)
第1步之后就成了 A' B' C' D' 这样的位置关系。后面的就不画了,不好写的。
| \ | \ | \ |
A B C D
/** * 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 == nullptr) return nullptr; RandomListNode* node = head; //第一步,将新结点插入到原结点的后面 while(node) { RandomListNode* new_node = new RandomListNode(node->label); new_node->next = node->next;//新结点指向下一个原结点 node->next = new_node;//原结点指向自己的拷贝 node = node->next->next;//移动到下一个原结点 } node = head; //第二步,复制random while(node) { //如果原结点的random存在,则新结点的random指向node的random的next。注意这里要加next,不加的话就成了新结点的random指向一个旧结点 if(node->random) node->next->random = node->random->next; node = node->next->next;//移动到下一个原结点 } //第三步,将新的结点从这个链表脱离出来 RandomListNode* new_head = head->next; node = head; while(node) { RandomListNode* new_node = node->next;//这个结点时新的还未和新链表链接好的结点 node->next = new_node->next;//注意新旧链表结点的顺序 if(new_node->next) new_node->next = node->next->next; node = node->next; } return new_head; } };