[剑指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结束.对于每个测试案例,输入的第一 ...
随机推荐
- openGL-------------别人的博客
https://blog.csdn.net/dcrmg/article/category/6505957 OpenGL(一)绘制圆.五角星.正弦曲线 ========================= ...
- XML中的变量传值
在action的java类中定义变量之后,在XML中获取该变量进行对应传值:: 在指定方法中获取XML配置文件的变量传值::
- Python基础-TypeError:takes 2 positional arguments but 3 were given
Error: 今天写一段简单类定义python代码所遇到报错问题:TypeError: drive() takes 2 positional arguments but 3 were given 代码 ...
- SecureCRT使用本地公钥 SSH 免密码登录Linux
其原理与Linux系统之间的SSH通道原理是一样的 下文中如果创建公钥的格式是:标准公钥和VanDyke私钥格式,需要用ssh-keygen -i -f 转换.如果是OpenSSH密钥格式可直接修改文 ...
- Innodb独立的undo tablespace
[MySQL5.6] Innodb独立的undo tablespace 在MySQL5.6中开始支持把undo log分离到独立的表空间,并放到单独的文件目录下:这给我们部署不同IO类型的文件位置 ...
- eclipse打断点,进行弹窗提示后点击是才进入debug视图,这个要怎么恢复
window --> preferences --> Run/Debug --> Perspectives 里的 open the associated perspective wh ...
- Linux通配符与基础正则表达式、扩展正则表达式
在Linux命令行操作或者SHELL编程中总是容易混淆一些特殊字符的使用,比如元字符‘*’号,作为通配符匹配文件名时表示0个到无穷多个任意字符.而作为正则表达式匹配字符串时,表示重复0个到无穷多个的前 ...
- react设置innerHTML
<!DOCTYPE html> <html> <head> <meta content="text/html; charset=utf-8" ...
- 367. Valid Perfect Square
原题: 367. Valid Perfect Square 读题: 求一个整数是否为完全平方数,如1,4,9,16,……就是完全平方数,这题主要是运算效率问题 求解方法1:812ms class So ...
- C++ MFC常用函数(转)
WinExec() ExitWindowsEx() GlobalMemoryStatus() GetSystemInfo() GetSystemDirectory() GetWindowsDirect ...