📅  最后修改于: 2023-12-03 15:11:15.708000             🧑  作者: Mango
本文将介绍一个用于克隆具有 Next 和随机指针的链表的 C++ 程序集。该程序集包含两个函数:copyRandomList
和copyLinkedList
。它们分别用于克隆带有随机节点和不带随机节点的链表。
Node* copyRandomList(Node* head) {
if (!head) return NULL;
unordered_map<Node*, Node*>mp;
Node*cur = head;
while (cur) {
mp[cur] = new Node(cur->val);
cur = cur->next;
}
cur = head;
while (cur) {
mp[cur]->next = mp[cur->next];
mp[cur]->random = mp[cur->random];
cur = cur->next;
}
return mp[head];
}
Node* copyRandomList(Node* head)
head
- 指向链表头结点的指针该函数使用了哈希表来存储原链表和对应的新链表的节点。首先遍历原链表,并将每个节点的值存储到新链表的对应节点中。然后再次遍历原链表,并根据原链表的随机指针关系,建立新链表的随机指针关系。最后,返回新链表的头结点。
ListNode* copyLinkedList(ListNode* head) {
if (!head) return NULL;
ListNode *cur = head, *temp;
while (cur) {
temp = cur->next;
cur->next = new ListNode(cur->val);
cur->next->next = temp;
cur = temp;
}
cur = head;
while (cur) {
if (cur->random)
cur->next->random = cur->random->next;
cur = cur->next->next;
}
cur = head;
ListNode *copy_head = head->next;
while (cur) {
temp = cur->next;
cur->next = temp->next;
if (temp->next)
temp->next = temp->next->next;
cur = cur->next;
}
return copy_head;
}
ListNode* copyLinkedList(ListNode* head)
head
- 指向链表头结点的指针该函数使用了三次遍历来复制链表。首先,遍历原链表,并将每个节点的值存储到新链表的对应节点中,并将其插入到原链表中。然后,再次遍历原链表,并建立新链表的随机指针关系。最后,再次遍历原链表,将原链表和新链表分离,最终返回新链表的头结点。