复杂链表的复制

题目描述

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)

解题思路

O(n*n)实现

  1. 复制链表节点及其普通指针的指向;
  2. 遍历每个节点,找到其特殊指针的指向;

O(n)实现+辅助空间

  1. 复制链表节点及其普通指针的指向,同时把每个节点特殊指针的配对存到一个hash表里;
  2. 遍历hash表完成特殊指针的指向。

O(n)实现

  1. 复制链表节点及其普通指针的指向;
  2. 复制链表节点的特殊指针;
  3. 将复制的节点取出。
/*
struct RandomListNode {int label;struct RandomListNode *next, *random;RandomListNode(int x) :label(x), next(NULL), random(NULL) {}
};
*/
class Solution {
public:RandomListNode* Clone(RandomListNode* pHead){if (!pHead) return NULL;CloneNode(pHead);ConnectedRandom(pHead);return ClonedList(pHead);}// 复制链表节点及其普通指针的指向void CloneNode(RandomListNode* pHead){RandomListNode* pNode = pHead;while(pNode != NULL){RandomListNode* pCloned = new RandomListNode(pNode->label);// pCloned->label = pNode->label;pCloned->next = pNode->next;pCloned->random = NULL;pNode->next = pCloned;pNode = pCloned->next;}}// 复制链表节点的特殊指针void ConnectedRandom(RandomListNode* pHead){RandomListNode* pNode = pHead;while(pNode != NULL){RandomListNode* pCloned = pNode->next;if(pNode->random!=NULL){pCloned->random = pNode->random->next;}pNode = pCloned->next;}}// 将复制的节点取出RandomListNode* ClonedList(RandomListNode* pHead){RandomListNode* pNode = pHead;RandomListNode* pClonedHead = NULL;RandomListNode* pClonedNode = NULL;if(pNode != NULL){pClonedHead = pNode->next;pClonedNode = pNode->next;pNode->next = pClonedNode->next;pNode = pNode->next;}while(pNode != NULL){pClonedNode->next = pNode->next;pClonedNode = pClonedNode->next;pNode->next = pClonedNode->next;pNode = pNode->next;           }return pClonedHead;}
};

剑指offer 26:复杂链表的复制相关推荐

  1. 【LeetCode】剑指 Offer 35. 复杂链表的复制

    [LeetCode]剑指 Offer 35. 复杂链表的复制 文章目录 [LeetCode]剑指 Offer 35. 复杂链表的复制 package offer;import java.util.Ar ...

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

    剑指 Offer 35. 复杂链表的复制 题目 题目链接 解题思路 题目理解 解题思路 具体代码 题目 题目链接 https://leetcode-cn.com/problems/fu-za-lian ...

  3. 《剑指offer》-- 复杂链表的复制、字符串的排列、数组中出现次数超过一半的数字、连续子数组的最大和

    一.复杂链表的复制: 参考牛客网的chancy:https://www.nowcoder.com/questionTerminal/f836b2c43afc4b35ad6adc41ec941dba 1 ...

  4. 【三次优化】剑指 Offer 35. 复杂链表的复制

    立志用最少代码做最高效的表达 请实现 copyRandomList 函数,复制一个复杂链表.在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意 ...

  5. 剑指offer——35复杂链表的复制

    这题很是巧妙. 突破了常规思维. 竟然可以把传入进来的链表和复制的链表链在一起.然后再算出slibling指针.最后在分离. 直接把空间复杂度变为O(1)了. 很巧妙,很实用. 题目: 请实现函数Co ...

  6. [剑指Offer] 25.复杂链表的复制

    1 /* 2 struct RandomListNode { 3 int label; 4 struct RandomListNode *next, *random; 5 RandomListNode ...

  7. 剑指 Offer 35. 复杂链表的复制(哈希/衍生拆分图解)

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

  8. LeetCode笔记】剑指 Offer 35. 复杂链表的复制(Java、哈希表、原地算法)

    文章目录 题目描述 思路 && 代码 1. 哈希表法 2. 原地算法 二刷 题目描述 主要有两个考虑点: 不能改变原链表 新链表赋予 next.random 时,复制结点不一定存在 思 ...

  9. 【算法】剑指 Offer 35. 复杂链表的复制 【重刷】

    1.概述 地址:https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof/ 请实现 copyRandomList 函数,复制一个复 ...

  10. 剑指Offer之复杂链表的复制

    题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用,否 ...

最新文章

  1. HTML5 progress和meter控件
  2. ipad流水布局及其旋转界面view间隔布局调整
  3. 专栏 | 基于 Jupyter 的特征工程手册:特征选择(三)
  4. Istio流量管理实践之(3): 基于Istio实现流量对比分析
  5. python if写在return 后面_python中return如何写
  6. Oracle run leve,UNIX自动启动oracle
  7. 视觉SLAM笔记(49) 后端状态估计
  8. 转)TNS协议--翻译自《The Oracle Hackers Handbook》
  9. GARFIELD@02-13-2005
  10. 学个Antenna:手机天线入门
  11. Filter vs Listener
  12. c++语言杨辉三角,杨辉三角 (C++代码)
  13. Linux 基本命令入门
  14. windows 系统遍历USB设备 VID和PID
  15. 【解决篇】映美FP-530K+打印发票卡纸,色带安装问题
  16. SmartBI入门(二)配置SmartBI
  17. mysql数据倾斜_Hive SQL 数据倾斜总结
  18. php如何开发调色器,HTML5+Js制作的一款简易调色器
  19. oracle- 同义词
  20. java实现国密加解密

热门文章

  1. 使用json-server搭建模拟api接口
  2. CentOS7定制封装发行版-基于CentOS minimal
  3. 社区智能家居产品研发商西谷数字新三板挂牌上市
  4. 静态方法调用注入对象(springMvc)
  5. mysql构架,索引,视图,查询语句
  6. 为DropDownList 添加optgroup分组以及为ListItem 加式样
  7. html 重置画布坐标系,html5清空画布方法(三种)
  8. numpy常用函数之random.normal函数
  9. 计算机视觉这篇就够了
  10. 行人识别,无需Anchor | CVPR 2021