链接

https://www.nowcoder.com/practice/f836b2c43afc4b35ad6adc41ec941dba?tpId=13&tqId=11178&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

题意

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。

解题思路

方法一:较优,时间复杂度O(N),空间复杂度O(N)

  • 第一遍,复制原始链表并暂不给复制节点的random指针赋值,同时把节点与copy及copy对应节点的地址<N,N'>信息存到哈希表。
  • 第二遍,给复制节点的random指针赋值时,有N'->random=map[S],而哈希查找时间复杂度O(1)

方法二:优,时间复杂度O(N),不需要额外辅助空间

  • 第一遍,把copy节点连到原链对应节点后面,暂不处理random指针。
  • 第二遍,给复制节点random指针赋值,N'->random=N->random->next;
  • 第三遍,把制造出的链表拆成愿链表和新copy链表

代码

使用方法二、特别注意注释的两个地方,即注意防止非法访问。

/*
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 nullptr;
}
pHead=addCopyNode(pHead);
pHead=addRandomPtr(pHead);
RandomListNode *pCopy=separateList(pHead);
return pCopy;
}
private:
RandomListNode* addCopyNode(RandomListNode* pHead){
RandomListNode *p=pHead;
while(p){
RandomListNode *pCopyNode=new RandomListNode(p->label);
pCopyNode->next=p->next;
p->next=pCopyNode;
p=pCopyNode->next;
}
return pHead;
} RandomListNode* addRandomPtr(RandomListNode* pHead){
RandomListNode *p=pHead;
while(p){
if(p->random){//
p->next->random=p->random->next;
}
p=p->next->next;
}
return pHead;
} RandomListNode* separateList(RandomListNode* pHead){
RandomListNode *p=pHead;
RandomListNode *pCopyHead=pHead->next; while(p){
//p指向原节点 ;当p非空 , p->next->next一定可以访问
RandomListNode *tempPtr=p->next;
p->next=tempPtr->next; //p指向copy节点 ; 要区分原节点再写一遍 ,因为若p为copy节点, 当p非空 ,p->next->next可能不可访问
p=tempPtr;
tempPtr=p->next;
if(tempPtr){
p->next=tempPtr->next;
}
p=tempPtr;//保证这里的p指向下一个原节点
} return pCopyHead;
} };

[剑指Offer]35-复杂链表的复制的更多相关文章

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

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

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

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

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

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

  4. 每日一题 - 剑指 Offer 35. 复杂链表的复制

    题目信息 时间: 2019-06-28 题目链接:Leetcode tag: 链表 难易程度:中等 题目描述: 请实现 copyRandomList 函数,复制一个复杂链表.在复杂链表中,每个节点除了 ...

  5. 力扣 - 剑指Offer 35.复杂链表的复制

    目录 题目 思路1 代码实现 思路2 代码实现 题目 请实现 copyRandomList 函数,复制一个复杂链表.在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 rando ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 【JEECG技术文档】JEECG 组织机构导入V3.7

    1.功能介绍 组织机构导入 提供组织机构模版导入功能,使用户更快速的创建组织机构 要使用组织机构导入功能需要完成以下步骤: 1. 下载模版excel 2. 填写组织机构信息 3. 点击导入-选择文件- ...

  2. hive,分桶,内外部表,分区

    简单的word-count操作: [root@master test-map]# head -10 The_Man_of_Property.txt    #先看看数据Preface“The Forsy ...

  3. jsfl 选择图层 选择帧 转化成mc

    //打开fla var _openDOC = fl.openDocument("file:///E|TE/爱.fla"); //获取图层4的总帧 var _Length=fl.ge ...

  4. js求时间差,两个日期月份差

    var date1=new Date();  //开始时间 alert("aa"); var date2=new Date();    //结束时间 var date3=date2 ...

  5. docker之container

    转自:https://www.cnblogs.com/jsonhc/p/7760144.html 运行一个container的本身就是开启一个具有独立namespace的进程 进程有自己的网络,文件系 ...

  6. 尚硅谷redis学习10-复制

    是什么? 能干嘛? 怎么玩? 1) 初始情况 设置slave 日志查看 主机查看 备机日志 复制状态 觉见问题 1 切入点问题?slave1.slave2是从头开始复制还是从切入点开始复制?比如从k4 ...

  7. Jenkins:管理节点

    Jenkins 管理节点 是管理所有即将在其上执行任务(JOB)的slave机器,包括各种OS类型的主机,都可以作为节点,因为Jenkins是java实现的,所以能安装JVM的OS都可以作为Jenki ...

  8. win10家庭版升级专业版的两种方法和密钥

    win10家庭版升级专业版密钥:VK7JG-NPHTM-C97JM-9MPGT-3V66T4N7JM-CV98F-WY9XX-9D8CF-369TT FMPND-XFTD4-67FJC-HDR8C-3 ...

  9. [Nginx]实战Nginx:Nginx的一些介绍

    ------------------------------------------------------------------------------------------------ 首先列 ...

  10. android Button、TabLayout英文自动改小写为大写的问题

    如果是Button自动大写问题,直接设置Button的 textAllCaps="false" 即可: 如果是TabLayout出现全大写问题,先在style.xml加入属性: & ...