📌  相关文章
📜  用于克隆具有 Next 和随机指针的链表的 C++ 程序集 2(1)

📅  最后修改于: 2023-12-03 15:11:15.708000             🧑  作者: Mango

用于克隆具有 Next 和随机指针的链表的 C++ 程序集 2

本文将介绍一个用于克隆具有 Next 和随机指针的链表的 C++ 程序集。该程序集包含两个函数:copyRandomListcopyLinkedList。它们分别用于克隆带有随机节点和不带随机节点的链表。

copyRandomList函数
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 - 指向链表头结点的指针
  • 返回值:指向新链表头结点的指针
  • 功能:复制带有随机节点的链表,并返回该链表的副本
函数实现

该函数使用了哈希表来存储原链表和对应的新链表的节点。首先遍历原链表,并将每个节点的值存储到新链表的对应节点中。然后再次遍历原链表,并根据原链表的随机指针关系,建立新链表的随机指针关系。最后,返回新链表的头结点。

copyLinkedList函数
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 - 指向链表头结点的指针
  • 返回值:指向新链表头结点的指针
  • 功能:复制不带有随机节点的链表,并返回该链表的副本
函数实现

该函数使用了三次遍历来复制链表。首先,遍历原链表,并将每个节点的值存储到新链表的对应节点中,并将其插入到原链表中。然后,再次遍历原链表,并建立新链表的随机指针关系。最后,再次遍历原链表,将原链表和新链表分离,最终返回新链表的头结点。