Copy List with Random Pointer
描述
A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.
Return a deep copy of the list.
分析
无
代码
- Java
- C++
// Copy List with Random Pointer
// 两遍扫描,时间复杂度O(n),空间复杂度O(1)
class Solution {
public RandomListNode copyRandomList(RandomListNode head) {
for (RandomListNode cur = head; cur != null; ) {
RandomListNode node = new RandomListNode(cur.label);
node.next = cur.next;
cur.next = node;
cur = node.next;
}
for (RandomListNode cur = head; cur != null; ) {
if (cur.random != null)
cur.next.random = cur.random.next;
cur = cur.next.next;
}
// 分拆两个单链表
RandomListNode dummy = new RandomListNode(-1);
for (RandomListNode cur = head, new_cur = dummy;
cur != null; ) {
new_cur.next = cur.next;
new_cur = new_cur.next;
cur.next = cur.next.next;
cur = cur.next;
}
return dummy.next;
}
};
// Copy List with Random Pointer
// 两遍扫描,时间复杂度O(n),空间复杂度O(1)
class Solution {
public:
RandomListNode *copyRandomList(RandomListNode *head) {
for (RandomListNode* cur = head; cur != nullptr; ) {
RandomListNode* node = new RandomListNode(cur->label);
node->next = cur->next;
cur->next = node;
cur = node->next;
}
for (RandomListNode* cur = head; cur != nullptr; ) {
if (cur->random != NULL)
cur->next->random = cur->random->next;
cur = cur->next->next;
}
// 分拆两个单链表
RandomListNode dummy(-1);
for (RandomListNode* cur = head, *new_cur = &dummy;
cur != nullptr; ) {
new_cur->next = cur->next;
new_cur = new_cur->next;
cur->next = cur->next->next;
cur = cur->next;
}
return dummy.next;
}
};