题目描述

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

  方法一:

    使用hash表将链表节点记录,其key为节点值,这样有个缺陷就是当有相同的节点值时,就不知道key对应的是哪个节点地址了

  方法二:

    直接将复制的节点置于原节点后面,这样找random节点时,很方便,不需要额外空间
    将原链表数组原地复制两份:
      head 1 2 3 4 5 6 NULL
  复制成: head head' 1 1' 2 2' 3 3' 4 4' 5 5' 6' 6' NULL

  然后Copy则取带'的节点就行

  

 //使用hash表将链表节点记录,其key为节点值,这样有个缺陷就是当有相同的节点值时,就不知道key对应的是哪个节点地址了
class Solution01 {
public:
RandomListNode* Clone(RandomListNode* pHead)
{
unordered_map<int, RandomListNode*>map;
RandomListNode *p, *q, *newHead = new RandomListNode();
p = pHead;
q = newHead;
while (p != nullptr)
{
q->next = new RandomListNode(p->label);
map[p->label] = q->next;
p = p->next;
q = q->next;
}
p = pHead;
q = newHead->next;
while (p != nullptr)
{
if (p->random != nullptr)
q->random = map[p->random->label];
p = p->next;
q = q->next;
}
return newHead->next;
}
}; //直接将复制的节点置于原节点后面,这样找random节点时,很方便,不需要额外空间
class Solution02 {
public:
RandomListNode* Clone(RandomListNode* pHead)
{
if (pHead == nullptr)return nullptr;
RandomListNode *p = pHead, *q = nullptr, *newHead = new RandomListNode();
while (p != nullptr)//复制主链表
{
RandomListNode *q = new RandomListNode(p->label);
q->next = p->next;
p->next = q;
p = q->next;
}
p = pHead;
while (p != nullptr)//复制随机节点
{
if (p->random != nullptr)
p->next->random = p->random->next;//原链表指向哪,那么新链表就指向其后面
p = p->next->next;
}
p = pHead;
q = newHead;
while (p!=nullptr)//取出复制链表,并还原链表
{
q->next = p->next;//取新链表
p->next = p->next->next;//还原原链表
p = p->next;
q = q->next;
}
return newHead->next;
}
};

剑指offer——37复杂链表的复制的更多相关文章

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

    剑指 Offer 35. 复杂链表的复制 Offer_35 题目详情 方法一 可以使用一个HashMap来存储旧结点和新结点的映射. 这种方法需要遍历链表两遍,因为需要首先知道映射关系才能求出next ...

  2. 【剑指Offer】复杂链表的复制 解题报告(Python)

    [剑指Offer]复杂链表的复制 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题 ...

  3. 《剑指offer》复杂链表的复制

    本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:

  4. 【Java】 剑指offer(35) 复杂链表的复制

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 请实现函数ComplexListNode* Clone(Compl ...

  5. Go语言实现:【剑指offer】复杂链表的复制

    该题目来源于牛客网<剑指offer>专题. 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.( ...

  6. 剑指Offer 25. 复杂链表的复制 (链表)

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

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

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

  8. 剑指OFFER之复杂链表的复制(九度OJ1524)

    题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点). 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一 ...

  9. 剑指offer:复杂链表的复制

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

随机推荐

  1. Java的poi技术遍历Excel时进行空Cell,空row,判断

    /** * 导入信息 */ @Override public List<Object> add(HttpServletRequest request) { // TODO Auto-gen ...

  2. 炼数成金数据分析课程---14、Logistic回归

    炼数成金数据分析课程---14.Logistic回归 一.总结 一句话总结: 大纲+实例快速学习法 主要讲Logistic回归的原理及编程实现 1.事件的优势比(odds)是什么? 记y取1的概率是p ...

  3. Makefile中的函数

    Makefile 中的函数 Makefile 中自带了一些函数, 利用这些函数可以简化 Makefile 的编写. 函数调用语法如下: $(<function> <arguments ...

  4. maven学习整理-基础知识

    1.maven认识 maven是一种自动化的构建工具,它主要解决的问题有: ①项目中的划分规则:原先我们用package或文件夹的形式来划分不同模块,导致在一个项目中存在大量的文件夹和包代码显得庞大: ...

  5. 5、通过Appium Desktop实现页面元素定位

    之前我们已经安装了Appium Desktop,下面就让我们使用Appium Desktop实现页面元素定位 1.首先我们打开Appium Desktop,进入如下界面,点击Start Server ...

  6. 拾遗:Git 与 Svn hook 不执行问题

    要点: GIT 或 SVN 的 hook 执行之前,会将所有环境变量清空,因此在其中执行命令时,必须指定绝对路径或重新设置必要的环境变量,如:$HOME 等 修改为正确的名称,如:post-commi ...

  7. 让微信小程序页面之间的通信不在变得困难

    一个开始 小程序开发者总会碰到各种页面之间的通信问题,实现方式也五花八门,比如... 场景还原 首先这是一个电商小程序. 有这样一个需求: 首页某个地方要展示购物车商品数量. 当我在其他页面加购了商品 ...

  8. VisualStuido中将C#脚本封装打包DLL并调用

    DLL (Dynamic Link Library)---动态链接库 首先了解下使用DLL的优势,程序运行时不用加载所有代码,只有运行到引用时,才从DLL库中取出.并且使用DLL文件还可以减小程序体积 ...

  9. 关于redis闪退的案例

    我需要恢复之前备份的文件:dump.rdb,文件大小2.2G 于是将dump.rdb放在redis的安装目录下,然后启动redis. ./redis-server redis.conf 然后我在另一个 ...

  10. span里面插入文字

    .text-box span::before{   content:attr(data-text);}