/**
* 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) {}
* };
*/
/*
本题题意是对链表进行深度复制,这里的难度主要是随机指针的问题。这里采用如下步骤求解该题:
1.在原始链表每个节点的后面,插入与当前结点一样值的节点。
2.修改每个插入结点的随机指针。
3.分开新旧链表。
参考自:https://github.com/soulmachine/leetcode
*/
class Solution {
public:
RandomListNode *copyRandomList(RandomListNode *head) {
//1.在每个节点后面插入同样结点
RandomListNode *cur(head);
while(cur != nullptr){
RandomListNode *tmp = new RandomListNode(cur->label);
tmp->next = cur->next;
cur->next = tmp;
cur = cur->next->next;
}
//2.修改新插入结点的随机指针
cur = head;
while(cur != nullptr){
if(cur->random != nullptr){
cur->next->random = cur->random->next;
}
cur = cur->next->next;
}
//3.拆开两个单链表
cur = head;
RandomListNode newHead(-1), *new_cur(&newHead);
while(cur != nullptr){
new_cur->next = cur->next;
new_cur = new_cur->next;
cur->next = cur->next->next;
cur = cur->next;
}
return newHead.next;
}
};
09-18
09-18