【Java】 剑指offer(35) 复杂链表的复制
本文参考自《剑指offer》一书,代码采用Java语言。
题目
请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表。在复杂链表中,每个结点除了有一个m_pNext指针指向下一个点外,还有一个m_pSibling 指向链表中的任意结点或者nullptr。
思路
思路1:先复制结点,用next链接,最后根据原始结点的sibling指针确定该sibling结点距离头结点的位置,从而对复制结点设置sibling指针。但是该思路对于n个结点的链表,每个结点的sibling都需要O(n)个时间步才能找到,所以时间复杂度为O(n^2)
思路2:复制原始结点N创建N’,用next链接。将<N,N'>的配对信息存放入一个哈希表中;在设置sibling时,通过哈希表,只需要用O(1)的时间即可找到复制结点的sibling。该方法的时间复杂度为O(n),但空间复杂度为O(n)。
思路3:复制原始结点N创建N’,将N'链接到N的后面;根据原始结点N的sibling可以快速设置N'结点的sibling,最后将这个长链表拆分成原始链表和复制链表(根据奇偶位置)
测试算例
1.功能测试(sibling指向自己;链表只有一个结点;sibling指向null或者指向结点)
2.特殊测试(头结点为null)
Java代码
//题目:请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复
//制一个复杂链表。在复杂链表中,每个结点除了有一个m_pNext指针指向下一个
//结点外,还有一个m_pSibling 指向链表中的任意结点或者nullptr。 public class CopyComplexList {
public class ComplexListNode {
int val;
ComplexListNode next = null;
ComplexListNode sibling = null; ComplexListNode(int label) {
this.val = label;
}
} /*
* 主程序(包含三步)
*/
public ComplexListNode cloneList(ComplexListNode head) {
cloneNodes(head); //1.复制结点
connectSiblingNodes(head); //2.设置sibling
return reconnectNodes(head);//3.拆分长链表
} /*
* 第一步:复制每个结点,并插入到原始节点的后面
*/
private void cloneNodes(ComplexListNode head) {
ComplexListNode pNode=head;
while(pNode!=null) {
ComplexListNode clonedNode=new ComplexListNode(pNode.val);
clonedNode.next=pNode.next;
pNode.next=clonedNode;
pNode=clonedNode.next;
}
} /*
* 第二步:根据原结点的sibling,设置复制结点的sibling
*/
private void connectSiblingNodes(ComplexListNode head) {
ComplexListNode pNode=head;
while(pNode!=null) {
if(pNode.sibling!=null) //必须考虑到siblingNode==null的情况!
pNode.next.sibling=pNode.sibling.next;
pNode=pNode.next.next;
}
} /*
* 第三步:将长链表拆分成原始链表和复制链表(根据奇偶位置)
*/
private ComplexListNode reconnectNodes(ComplexListNode head) {
ComplexListNode clonedHead=null;
ComplexListNode clonedNode=null;
ComplexListNode pNode=head;
if(head!=null) {
clonedHead=head.next;
clonedNode=pNode.next;
pNode.next=clonedNode.next;
pNode=pNode.next; //提前将pNode指向下一个结点,方便判断是否为null
}
while(pNode!=null) {
clonedNode.next=pNode.next;
clonedNode=clonedNode.next;
pNode.next=clonedNode.next;
pNode=pNode.next;
}
return clonedHead;
}
}
收获
1.涉及链表结点操作,必须时刻注意对null的判断
2.复制链表时,在原始结点后面直接插入复制结点,这种方法非常方便,有较高的时间效率,先记住,以后可能会遇到类似的应用
3.查找时间复杂度为O(1),可以考虑使用哈希表。哈希表的应用要掌握。
【Java】 剑指offer(35) 复杂链表的复制的更多相关文章
- 剑指 Offer 35. 复杂链表的复制
剑指 Offer 35. 复杂链表的复制 Offer_35 题目详情 方法一 可以使用一个HashMap来存储旧结点和新结点的映射. 这种方法需要遍历链表两遍,因为需要首先知道映射关系才能求出next ...
- 剑指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结束.对于每个测试案例,输入的第一 ...
随机推荐
- 基于802.11Fuzz技术的研究
转自安全客 关于无线的Fuzz最开始接触了解时,国内基本毛线都搜不到.经过几个月的资料搜集和学习,将大约全网的fuzz资料整理翻译分析并读懂写下,就为填补国内空白,也希望无线爱好者能多多交流. 在各个 ...
- BZOJ:1816 [Cqoi2010]扑克牌 (贪心或二分答案)
题面 \(solution:\) 这道题难就难在你能否读懂题目的意思,我们将它翻译一下: 现在我有n根竹子(每根竹子有\(c_i\)节,每节竹子高度为1),我可以通过消耗一点法力值使某一根竹子的某两节 ...
- mysql 案例~ 分区表
一 简介:今天来聊聊分区表的概念和维护二分区的优点: 1.提高查询性能:只需要搜索特定分区,而非整张表,提高了查询速度. 2.节约维护时间:单个分区的数据装载,索引重建,备份,维护远远小于整张表的 ...
- 电子邮件和URL输入控件
HTML5还引入了让用户输入邮箱地址和URL的输入控件.那些不支持这类输入控件的浏览器会把他们当成普通文本框来处理. <!DOCTYPE html> <!-- To change t ...
- SpringBoot整合日志
Java日志 日志的接口层.抽象层 日志的实现 JCL(Jakarta Commons Logging) SLF4J(Simple Logging Facade for Java) Jboss-Log ...
- ubuntu下tensorflow 报错 libcusolver.so.8.0: cannot open shared object file: No such file or directory
解决方法1. 在终端执行: export LD_LIBRARY_PATH=”$LD_LIBRARY_PATH:/usr/local/cuda/lib64” export CUDA_HOME=/usr/ ...
- ubuntu 下 teamview 取消自动启动 autostart
sudo teamviewer daemon disable
- bzoj 1803: Spoj1487 Query on a tree III(主席树)
题意 你被给定一棵带点权的n个点的有根数,点从1到n编号. 定义查询 query(x,k): 寻找以x为根的k大点的编号(从小到大排序第k个点) 假设没有两个相同的点权. 输入格式: 第一行为整数n, ...
- centos6.5环境下svn服务器和客户端配置实用详解
一.服务器端配置 安装 # yum install -y subversion yum安装软件,不清除软件包的方法 # vim /etc/yum.conf keepcache=0 建立svn版本库数据 ...
- 如何优雅打印nginx header和body
场景 参考https://segmentfault.com/a/1190000000606867可以获取response的报文体,由于业务测试有获取响应头Header或响应体Body的需求,这里是通过 ...