Leetcode 剑指 Offer 35. 复杂链表的复制
题目
请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。
示例 1:
输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]
示例 2:
输入:head = [[1,1],[2,1]]
输出:[[1,1],[2,1]]
示例 3:
输入:head = [[3,null],[3,0],[3,null]]
输出:[[3,null],[3,0],[3,null]]
示例 4:
输入:head = []
输出:[]
解释:给定的链表为空(空指针),因此返回 null。
思路
- 这道题目的解法非常巧妙, 我们在原链表之上在每个节点之后复制一个一模一样的节点, 即1->2->3->nullptr, 变成1->1->2->2->3->3->nullptr
- 接下来是处理random的指针, 以1为例子, 先获取1的random指向哪,比方说2, 此时再让1的复制节点的random指向2的next指针, 即p->next->random = p->random->next;
- 由于是链表的复制, 所以这里不推荐删除原链表, 所以这里采用分离, 采用的方法就是让next指针指向next->next即可
代码 —— c++
/*
// Definition for a Node.
class Node {
public:
int val;
Node* next;
Node* random;
Node(int _val) {
val = _val;
next = NULL;
random = NULL;
}
};
*/
class Solution {
public:
Node* copyRandomList(Node* head) {
if (!head) return nullptr;
Node* p = head;
// next pointer
while (p) {
Node* t = new Node(p->val);
t->next = p->next;
p->next = t;
p = p->next->next;
}
// random pointer
p = head;
while (p) {
if (p->random) {
p->next->random = p->random->next;
}
p = p->next->next;
}
// divide
p = head;
Node* copy_head = head->next;
Node* q = copy_head;
while (p && q) {
p->next = p->next->next;
p = p->next;
if (q->next) {
q->next = q->next->next;
q = q->next;
}
}
return copy_head;
}
};