首页 > 其他分享 >剑指 Offer 35. 复杂链表的复制

剑指 Offer 35. 复杂链表的复制

时间:2022-10-13 15:25:21浏览次数:42  
标签:Node head cur Offer random 35 next 链表

请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。

思路1:利用哈希表来进行链表指针的存储

即将链表问题转换为数组,以便于直接存取

头文件的导入:#include<unordered_map>

代码:

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 == nullptr) return nullptr;
        unordered_map<Node*,Node*>map;
        Node* cur = head;
        //哈希表存储链表
        while(cur){
            map[cur] = new Node(cur->val);
            cur = cur ->next;
        }
        //利用哈希表实现next和random
        cur = head;
        while(cur){
            map[cur]->next=map[cur->next];
            map[cur]->random= map[cur->random];
            cur = cur->next;
        }
        return map[head];

        
    }
};

思路2:

  1. 复制一个新的节点在原有节点之后,如 1 -> 2 -> 3 -> null 复制完就是 1 -> 1 -> 2 -> 2 -> 3 - > 3 -> null
  2. 从头开始遍历链表,通过 cur.next.random = cur.random.next 可以将复制节点的随机指针串起来,当然需要判断 cur.random 是否存在
  3. 将复制完的链表一分为二 根据以上信息,我们不难写出以下代码
    class Solution {
        public Node copyRandomList(Node head) {
            if (head == null) {
                return head;
            }
            // 完成链表节点的复制
            Node cur = head;
            while (cur != null) {
                Node copyNode = new Node(cur.val);
                copyNode.next = cur.next;
                cur.next = copyNode;
                cur = cur.next.next;
            }
    
            // 完成链表复制节点的随机指针复制
            cur = head;
            while (cur != null) {
                if (cur.random != null) { // 注意判断原来的节点有没有random指针
                    cur.next.random = cur.random.next;
                }
                cur = cur.next.next;
            }
    
            // 将链表一分为二
            Node copyHead = head.next;
            cur = head;
            Node curCopy = head.next;
            while (cur != null) {
                cur.next = cur.next.next;
                cur = cur.next;
                if (curCopy.next != null) {
                    curCopy.next = curCopy.next.next;
                    curCopy = curCopy.next;
                }
            }
            return copyHead;
        }
    }

     

标签:Node,head,cur,Offer,random,35,next,链表
From: https://www.cnblogs.com/lihaoxiang/p/16788218.html

相关文章

  • 534事务隔离级别演示1和535事务隔离级别演示2
    事务隔离级别演示1READ_UNCOMMITTED读未提交,即能够读取到没有被提交的数据,所以很明显这个级别的隔离机制无法解决脏读、不可重复读、幻读中的任何一种,因此很少......
  • 合并单链表
    用尾插法合并单链表算法思想:让头指针p指向空,用来构建链表Z,用m和n来遍历X和Y,逐个把较小的结点尾插进链表Z中,之后把剩余的链表尾插进Z的后面,形成新链表Z。伪代码如下:void......
  • 203. 移除链表元素
    203.移除链表元素给你一个链表的头节点head和一个整数val,请你删除链表中所有满足Node.val==val的节点,并返回新的头节点。 示例1:输入:head=[1,2,6,3,4......
  • MDK5.29,5.30,5.31,5.32,5.33, 5.34,5.35, 5.36, 5.37和各种pack软件包镜像下载(2022-05-04)
    MDK5.29,5.30,5.31,5.32,5.33,5.34,5.35,5.36,5.37和各种pack软件包镜像下载(2022-05-04) MDK软件:​​​mdk454.exe​​​(491.23MB)​​​mdk474.exe​​​(576.82MB)​​​......
  • 雷电USB4开源示波器,4通道,带宽350MHz,采样率1Gsps,上位机支持Windows和Linux
    开源:​​https://github.com/EEVengers/ThunderScope​​​这个示波器三大特色:(1)不仅开源,作者还有一个超详细的设计过程记录贴,有兴趣可以看看,这个还是非常难得的。   ......
  • C语言基于单链表的词典软件
    C语言基于单链表的词典软件实验1:日期:2022-10-4类型:设计型题目:基于单链表的词典软件内容:利用单链表存储词典,可以实现从文件中加载数据、查询单词、添加词条、删除词条......
  • part2-HOT100+剑指Offer
    leetcode:​​https://leetcode-cn.com/problemset/algorithms/​​​类别:热题HOT100easy篇共26道No.21--------------可将滑动窗口作为一个章节来看啦。。。标签:哈希......
  • LG-P3550 [POI2013]TAK-Taxis 题解
    LG-P3550[POI2013]TAK-TaxisSolution目录LG-P3550[POI2013]TAK-TaxisSolution更好的阅读体验戳此进入题面输入格式SolutionCodeUPD更好的阅读体验戳此进入题面存在......
  • LG-P3552 [POI2013]SPA-Walk 题解
    LG-P3552[POI2013]SPA-WalkSolution目录LG-P3552[POI2013]SPA-WalkSolution更好的阅读体验戳此进入题面输入格式SolutionCodeUPD更好的阅读体验戳此进入(建议您从上......
  • 环形链表
    环形链表一,题目描述给定一个链表的头节点,判断链表中是否存在环。存在返回true,不存在返回false。二,解题思路如果链表无环,遍历后最终都会指向null。如果有环,会重复遍历。......