「复制带随机指针的链表」的一个很巧妙解法
发布日期:2021-05-19 23:03:45 浏览次数:16 分类:精选文章

本文共 1258 字,大约阅读时间需要 4 分钟。

给定一个带有随机指针的链表节点,目标是对链表进行深拷贝。以下是详细的解决方案:

问题分析

每个链表节点包含一个额外的随机指针,该指针可以指向链表中的任意节点或空节点。深拷贝的要求是创建一个独立的链表,使得每个新节点的数据和指针均独立于原链表。

方法思路

  • 逐个复制节点:从原链表的第一个节点开始,逐个复制每个节点到新链表中。
  • 复制指针:在复制每个新节点时,将其随机指针指向原节点的随机指针所指的节点;同时,让新链表当前节点的后继节点指向原节点的后继节点。
  • 断开链表:完成复制后,断开新链表与原链表之间的连接,确保它们是独立的链表。
  • 解决代码

    class Solution {
    public:
    RandomListNode* copyRandomList(RandomListNode* head) {
    if (!head)
    return NULL;
    RandomListNode* cur = head;
    // 复制节点,处理next指针
    while (cur) {
    RandomListNode* node = new RandomListNode(cur->label);
    node->next = cur->next;
    cur->next = node;
    cur = node->next;
    }
    // 处理random指针
    cur = head;
    while (cur) {
    if (cur->random) {
    cur->next->random = cur->random->next;
    }
    cur = cur->next->next;
    }
    // 断开链表
    cur = head;
    while (cur) {
    cur->next = cur->next->next;
    cur = cur->next;
    }
    // 返回新链表的第2个节点
    return head ? head->next : NULL;
    }
    };

    代码解释

  • 复制节点:遍历原链表,逐个复制每个节点到新链表中。新节点的随机指针和后继节点均指向原节点的相应节点。
  • 处理随机指针:在复制完成后,调整新链表中每个节点的随机指针,确保其指向原链表中随机指针的目标节点。
  • 断开链表:通过调整每个节点的后继指针,断开新链表与原链表之间的连接,形成独立的新链表。
  • 这个方法避免了额外空间的占用,直接在线处理,展示了高效和巧妙的解法。

    上一篇:不会爬虫?送48本Python爬虫畅销书,助你一臂之力
    下一篇:趣图:会算法和不会算法的区别

    发表评论

    最新留言

    不错!
    [***.144.177.141]2025年05月05日 06时20分07秒