题目大意:求一个链表的深度拷贝,这个链表中的节点有两个指针,一个next指针指向它的下驱节点,另一个random指针可以指向空或者链表中任意的其他节点。
解题思路:分三步,
第一步顺序遍历链表,拷贝每个节点,将拷贝的节点插入到被拷贝节点的后面。
第二步,拷贝radom指针。
第三步,将拷贝节点分离出来。
#include <iostream>
#include <cstdio>
using namespace std;
struct RandomListNode {
int label;
RandomListNode *next, *random;
RandomListNode(int x) : label(x), next(NULL), random(NULL) {}
};
class Solution {
public:
RandomListNode *copyRandomList(RandomListNode *head) {
copyNode(head);
copyRandomNode(head);
return separate(head);
}
private:
void copyNode(RandomListNode *head) {
RandomListNode *cur = head;
while(cur != NULL) {
RandomListNode *node = new RandomListNode(cur->label);
node->next = cur->next;
cur->next = node;
cur = node->next;
}
}
void copyRandomNode(RandomListNode *head) {
RandomListNode *cur = head;
RandomListNode *copy_cur = cur != NULL ? cur->next : NULL;
while(cur != NULL && copy_cur != NULL) {
copy_cur->random = cur->random != NULL ? cur->random->next : NULL;
cur = copy_cur->next;
copy_cur = cur != NULL ? cur->next : NULL;
}
}
RandomListNode *separate(RandomListNode *head) {
RandomListNode *cur = head;
RandomListNode *copy_cur = cur != NULL ? cur->next : NULL;
RandomListNode *copy_head = copy_cur;
while(cur != NULL && copy_cur != NULL) {
cur->next = copy_cur->next;
cur = cur->next;
copy_cur->next = cur != NULL ? cur->next : NULL;
copy_cur = copy_cur->next;
}
return copy_head;
}
};