剑指offer-第四章解决面试题思路(复杂链表的复制)
题目:请写一个函数clone(ComplexListNode pHead),实现复杂链表的复制。
复杂链表的数据结构如下:public class ComplexListNode{int m_nValue;ComplexListNode m_pNext;ComplexListNode m_pSliping//指向链表中的任何一个节点}
例如:m_pSliping指向NUll的,并没有画出来。

将复杂的问题简单化,各个击破:
思路:第一步,就是复制节点,并连接到原始节点的后面,第二步,设置复制出来节点的m_pSliping.第三步,将复制的链表从原始链表中分离。
如图:



Java代码:
public class ComplexLinkCloned {
//对于复杂链表的复制问题:1、复制节点,并连接到原始节点的后面。2.设置复制出来节点的m_pSliping。
//3.将复制的链表从原始的链表中分离出来。
public class ComplexListNode{
int m_nValue;
ComplexListNode m_pNext;
ComplexListNode m_pSliping;
}
//复制节点
public void clonedNode(ComplexListNode pHead){
if(pHead==null)
return;
ComplexListNode pNode=pHead;
while(pNode!=null){
ComplexListNode pClonedNode=new ComplexListNode();
pClonedNode.m_nValue=pNode.m_nValue;
pClonedNode.m_pNext=pNode.m_pNext;
pClonedNode.m_pSliping=null;
pNode.m_pNext=pClonedNode;
pNode=pClonedNode.m_pNext;
}
}
//设置m_pSliping
public void connectSlipingNode(ComplexListNode pHead){
if(pHead==null)
return;
ComplexListNode pNode=pHead;
while(pNode!=null){
ComplexListNode pCloned=pNode.m_pNext;
if(pNode.m_pSliping!=null){
pCloned.m_pSliping=pNode.m_pSliping.m_pNext;
}
pNode=pCloned.m_pNext;
}
}
//将复制的链表从整个链表中分离
public ComplexListNode reConnectNode(ComplexListNode pHead){
ComplexListNode pNode=pHead;
ComplexListNode pClonedNode=null;
ComplexListNode pClonedHead=null;
if(pNode!=null){
pClonedHead=pClonedNode=pNode.m_pNext;
pNode.m_pNext=pClonedNode.m_pNext;
pNode=pNode.m_pNext;
}
while(pNode!=null){
pClonedNode.m_pNext=pNode.m_pNext;
pClonedNode=pClonedNode.m_pNext;
pNode.m_pNext=pClonedNode.m_pNext;
pNode=pNode.m_pNext;
}
return pClonedHead;
}
public ComplexListNode Clone(ComplexListNode pHead){
clonedNode(pHead);
connectSlipingNode(pHead);
return reConnectNode(pHead);
}
}
剑指offer-第四章解决面试题思路(复杂链表的复制)的更多相关文章
- 剑指offer第四章
剑指offer第四章 1.二叉树的镜像 二叉树的镜像:输入一个二叉树,输出它的镜像 分析:求树的镜像过程其实就是在遍历树的同时,交换非叶结点的左右子结点. 求镜像的过程:先前序遍历这棵树的每个结点,如 ...
- 【剑指Offer面试编程题】题目1524:复杂链表的复制--九度OJ
题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点). 输入: 输入可能包含多个测试样例,输入以EOF结束. 对于每个测试案例,输入的第 ...
- 剑指offer-第四章解决面试题思路之总结
- 剑指offer-第四章解决面试题思路(字符串的排序)
题目:输入一个字符串,打印出该字符串的全排列. 思路:将整个字符串分成两部分,第一部分为一个字符,将该字符和该字符后面的字符(直到最后一个字符)依次交换,确定第一个字符:然后固定第一个字符,将后面的字 ...
- 剑指offer-第四章解决面试题思路(二叉收索树和双向链表)
题目:输入一个二叉收索树,将二叉搜索树转换成排序的双向链表.要求不能创建节点,只能将链表中的指针进行改变. 将复杂的问题简单化:思路:二叉收索树,本身是一个排序结构,中序遍历二叉收索树就可以得到一组排 ...
- 剑指offer-第四章解决面试题思路(判断一个数组是否为二叉搜索树的后序遍历序列)
二叉搜索树:二叉搜索树根节点的左边都比根节点小,右边都比根节点大. 例题:输入一个数组,判断是否为二叉搜索树的后序遍历序列,如果是,返回true,如果不是,返回flase,假设没有重复的元素. 思路: ...
- 《剑指offer》第三十五题(复杂链表的复制)
// 面试题35:复杂链表的复制 // 题目:请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复 // 制一个复杂链表.在复杂链表中,每个结点除 ...
- 简直offer-第四章解决面试题思路(二叉树中和为某一值的路径)
题目:输入一颗二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径.从树的根节点往下一直到叶子节点形成一条路径. 思路:很明显用前序遍历可以从根节点开始遍历到叶子节点,然后将遍历的节点添加到 ...
- 剑指offer第五章
剑指offer第五章 1.数组中出现次数超过一半的数 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组 ...
随机推荐
- C# 异步同步调用
本文将主要通过“同步调用”.“异步调用”.“异步回调”三个示例来讲解在用委托执行同一个“加法类”的时候的的区别和利弊. 首先,通过代码定义一个委托和下面三个示例将要调用的方法: /*添加的命名空间 u ...
- LCD控制器与帧率、刷新率的关系分析
源:LCD控制器与帧率.刷新率的关系分析 LCM之Fmark功能 && LCD控制器同LCD驱动器的差别 && 帧率与刷新率的关系 && OLED背光
- Python3.x:pdf2htmlEX(解析pdf)安装和使用
Python3.x:pdf2htmlEX(解析pdf)安装和使用 简介 pdf2htmlEX是一款优秀的pdf转换成html的工具: 下载 windows下载地址:http://soft.rubypd ...
- 回溯算法 DFS深度优先搜索 (递归与非递归实现)
回溯法是一种选优搜索法(试探法),被称为通用的解题方法,这种方法适用于解一些组合数相当大的问题.通过剪枝(约束+限界)可以大幅减少解决问题的计算量(搜索量). 基本思想 将n元问题P的状态空间E表示成 ...
- git 强制放弃本地修改(新增、删除文件)【转】
本文转载自:https://blog.csdn.net/u012672646/article/details/56676804 本地修改了一些文件,其中包含修改.新增.删除的,不需要了想要丢弃,于是做 ...
- E - Water Distribution
E - Water Distribution 题目大意: 有\(N\)座城市,给定这\(N\)座城市的坐标和初始的水量\(x_i,y_i,a_i\),在两个城市之间运水的花费是两个城市的欧几里得距离. ...
- Java条件语句之 if
生活中,我们经常需要先做判断,然后才决定是否要做某件事情.例如,如果考试成绩大于 90 分,则奖励一个 IPHONE 5S .对于这种“需要先判断条件,条件满足后才执行的情况”,就可以使用if 条件语 ...
- Python 有点意思
基本语法 >>> width = 20 >>> height = 2 * 3 >>> width * height 120 >>> ...
- JNI_Z_04_属性的操作(非String类型的属性)
1.步骤 : (1).获取 jclass (2).获取 类属性字段的id(最后一个参数是 属性字段 的签名) (3).获取/设置 类属性字段的值 ZC: 貌似 JNI里面 操作 类属性字段,完全是 无 ...
- 项目中如何使用EF
本文将在技术层面挑战园子里的权威大牛们,言语不敬之处敬请包涵.本文旨为技术交流,欢迎拍砖. 园子里面分享和推荐Entity Framework(以下简称EF)的Repository(仓储)设计模式的文 ...