两种解法,本质都是建立原链表与deep copy之后的链表之间的关联
1.使用C++中定义好的map
2.自己建立二者关系,将deep copy后的链表Node依次对应插入原链表对应Node的next域
/**
* 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) {
RandomListNode *ptr = head, *ptrNew, *newHead = NULL, *prev, *ptrR, *ptrNewR;
int isFirst = 0;
map<RandomListNode*, RandomListNode*> relation;
while(ptr){
RandomListNode* rNode = (RandomListNode*)malloc(sizeof(RandomListNode));
rNode -> label = ptr -> label;
rNode -> next = NULL;
if(isFirst == 0){
newHead = rNode;
isFirst = 1;
}else{
prev -> next = rNode;
}
relation.insert(pair<RandomListNode*, RandomListNode*>(ptr, rNode));
prev = rNode;
ptr = ptr -> next;
}
ptr = head;
ptrNew = newHead;
while(ptr){
ptrNew -> random = relation[ptr -> random];
ptr = ptr -> next;
ptrNew = ptrNew -> next;
}
return newHead;
}
};
/**
* 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) {
RandomListNode *ptr = head, *ptrNew, *newHead = NULL, *next;
int isFirst = 0;
while(ptr){
RandomListNode* rNode = (RandomListNode*)malloc(sizeof(RandomListNode));
rNode -> label = ptr -> label;
rNode -> next = NULL;
if(isFirst == 0){
newHead = rNode;
isFirst = 1;
}
next = ptr -> next;
ptr-> next = rNode;
rNode -> next = next;
ptr = next;
}
ptr = head;
while(ptr){
ptr-> next -> random = ptr -> random == NULL?NULL:ptr -> random -> next;//判断ptr->random是否为NULL
ptr = ptr -> next -> next;
}
ptr = head;//初始化ptr
while(ptr && ptr -> next){
next = ptr -> next;
ptr -> next = next -> next;
next -> next = ptr -> next == NULL? NULL: ptr -> next -> next;//判断ptr->next是否为NULL
ptr = ptr -> next;
}
return newHead;
}
};