35复杂链表的复制
解法1:
把原来的A->B->C 变换成 A->A1 -> B->B1->C->C1
这样再次遍历的时候,当前结点复制结点的random就是指向当前结点random的下一个结点,最后再把原始结点和复制结点分离开就行了。
(不得不说,同样的思路,官方给的代码的优美程度直接碾压我)。
class Solution {
public:
Node* copyRandomList(Node* head) {
if(head == NULL){
return NULL;
}
Node* p = head;
while(p!=NULL){
Node* newNode = new Node(p->val);
newNode->next = p->next;
p->next = newNode;
p = p->next->next;
}
p = head;
for(;p != NULL; p = p->next->next){
p->next->random = p->random == NULL ? NULL : p->random->next;
}
Node* myhead = head -> next;
Node* q = head;
for( p = head->next; p->next != NULL; q = q->next,p = p->next){
q->next = p->next;
p->next = p->next->next;
}
q->next = NULL;
return myhead;
}
};
官方的解法1:
class Solution {
public:
Node* copyRandomList(Node* head) {
if (head == nullptr) {
return nullptr;
}
for (Node* node = head; node != nullptr; node = node->next->next) {
Node* nodeNew = new Node(node->val);
nodeNew->next = node->next;
node->next = nodeNew;
}
for (Node* node = head; node != nullptr; node = node->next->next) {
Node* nodeNew = node->next;
nodeNew->random = (node->random != nullptr) ? node->random->next : nullptr;
}
Node* headNew = head->next;
for (Node* node = head; node != nullptr; node = node->next) {
Node* nodeNew = node->next;
node->next = node->next->next;
nodeNew->next = (nodeNew->next != nullptr) ? nodeNew->next->next : nullptr;
}
return headNew;
}
};
/*
作者:LeetCode-Solution
链接:https://leetcode.cn/problems/fu-za-lian-biao-de-fu-zhi-lcof/solution/fu-za-lian-biao-de-fu-zhi-by-leetcode-so-9ik5/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
*/
解法2 :回溯 + hash表
利用回溯的方式,让每个节点的拷贝操作相互独立。对于当前节点,我们首先要进行拷贝,然后我们进行「当前节点的后继节点」和「当前节点的随机指针指向的节点」拷贝,拷贝完成后将创建的新节点的指针返回,即可完成当前节点的两指针的赋值
class Solution {
public:
unordered_map<Node*, Node*> cachedNode;
Node* copyRandomList(Node* head) {
if (head == nullptr) {
return nullptr;
}
if (!cachedNode.count(head)) {
Node* headNew = new Node(head->val);
cachedNode[head] = headNew;
headNew->next = copyRandomList(head->next);
headNew->random = copyRandomList(head->random);
}
return cachedNode[head];
}
};
/*
作者:LeetCode-Solution
链接:https://leetcode.cn/problems/fu-za-lian-biao-de-fu-zhi-lcof/solution/fu-za-lian-biao-de-fu-zhi-by-leetcode-so-9ik5/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
*/