[剑指Offer]35-复杂链表的复制
链接
题意
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的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-复杂链表的复制的更多相关文章
- 剑指 Offer 35. 复杂链表的复制
剑指 Offer 35. 复杂链表的复制 Offer_35 题目详情 方法一 可以使用一个HashMap来存储旧结点和新结点的映射. 这种方法需要遍历链表两遍,因为需要首先知道映射关系才能求出next ...
- 【Java】 剑指offer(35) 复杂链表的复制
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 请实现函数ComplexListNode* Clone(Compl ...
- 剑指offer——35复杂链表的复制
这题很是巧妙. 突破了常规思维. 竟然可以把传入进来的链表和复制的链表链在一起.然后再算出slibling指针.最后在分离. 直接把空间复杂度变为O(1)了. 很巧妙,很实用. 题目: 请实现函数Co ...
- 每日一题 - 剑指 Offer 35. 复杂链表的复制
题目信息 时间: 2019-06-28 题目链接:Leetcode tag: 链表 难易程度:中等 题目描述: 请实现 copyRandomList 函数,复制一个复杂链表.在复杂链表中,每个节点除了 ...
- 力扣 - 剑指Offer 35.复杂链表的复制
目录 题目 思路1 代码实现 思路2 代码实现 题目 请实现 copyRandomList 函数,复制一个复杂链表.在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 rando ...
- 【剑指Offer】复杂链表的复制 解题报告(Python)
[剑指Offer]复杂链表的复制 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题 ...
- 《剑指offer》复杂链表的复制
本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:
- Go语言实现:【剑指offer】复杂链表的复制
该题目来源于牛客网<剑指offer>专题. 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.( ...
- 剑指Offer 25. 复杂链表的复制 (链表)
题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点引用,否 ...
- 剑指OFFER之复杂链表的复制(九度OJ1524)
题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点). 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一 ...
随机推荐
- WPF中TextBox文件拖放问题
在WPF中,当我们尝试向TextBox中拖放文件,从而获取其路径时,往往无法成功(拖放文字可以成功).造成这种原因关键是WPF的TextBox对拖放事件处理机制的不同,具体可参考这篇文章Textbox ...
- zipfile模块
在python中操作zip文件, 基本上都是使用zipfile模块,他可以创建.解压文件,获取zip文件的元数据信息. 我们想要操作一个zip文件,第一步就是初始化ZipFile实例. 1.打开tes ...
- leetcode题解 Generate Parentheses
原文链接:https://leetcode.com/problems/generate-parentheses 给出数字n,求n对括号组成的合法字符串. 刚做出来,敲完代码,修改了一次,然后提交,ac ...
- Django 之Form
具体可参考:http://www.liujiangblog.com/course/django/153 https://www.cnblogs.com/liuguniang/p/7141837.htm ...
- Linux命令:findutils
本篇介绍Linux中常用的文件查找和定位工具,包括:find.locate.which.xargs等. GNU find 命令参考<https://www.gnu.org/software/fi ...
- happyxiaofan的程序员书单
转自 happyxiaofan 读书的看法 从15年7月至今,研究生期间读了不少书,读书让我学到了很多,也是提升技术能力的一个重要手段.可能很多人嫌读书太花时间,曾经的我一度也是这么认为的,觉得一 ...
- English Conversation – Checking in at an airport
English Conversation – Checking in at an airport Share Tweet Share Tagged With: Ben Franklin Exercis ...
- CSS3性能体验
如今许多新技术名词在不断的被提及中,已然向我们靠近.某篮球运动员说了:“变向过人”不是超级明星的专利,也许我也可以试着去做,现在看起来效果还不错...那么,现在我们来体验CSS3:CSS3中的动画功能 ...
- servlet 验证码生成
servlet package com.htpo.net; import java.awt.Color;import java.awt.Font;import java.awt.Graphics2D; ...
- python技巧 显示对象的所有属性
python技巧 显示对象的所有属性for attr in dir(ad):... print attr+":"+str(getattr(ad,attr))