题目:请写一个函数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-第四章解决面试题思路(复杂链表的复制)的更多相关文章

  1. 剑指offer第四章

    剑指offer第四章 1.二叉树的镜像 二叉树的镜像:输入一个二叉树,输出它的镜像 分析:求树的镜像过程其实就是在遍历树的同时,交换非叶结点的左右子结点. 求镜像的过程:先前序遍历这棵树的每个结点,如 ...

  2. 【剑指Offer面试编程题】题目1524:复杂链表的复制--九度OJ

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

  3. 剑指offer-第四章解决面试题思路之总结

  4. 剑指offer-第四章解决面试题思路(字符串的排序)

    题目:输入一个字符串,打印出该字符串的全排列. 思路:将整个字符串分成两部分,第一部分为一个字符,将该字符和该字符后面的字符(直到最后一个字符)依次交换,确定第一个字符:然后固定第一个字符,将后面的字 ...

  5. 剑指offer-第四章解决面试题思路(二叉收索树和双向链表)

    题目:输入一个二叉收索树,将二叉搜索树转换成排序的双向链表.要求不能创建节点,只能将链表中的指针进行改变. 将复杂的问题简单化:思路:二叉收索树,本身是一个排序结构,中序遍历二叉收索树就可以得到一组排 ...

  6. 剑指offer-第四章解决面试题思路(判断一个数组是否为二叉搜索树的后序遍历序列)

    二叉搜索树:二叉搜索树根节点的左边都比根节点小,右边都比根节点大. 例题:输入一个数组,判断是否为二叉搜索树的后序遍历序列,如果是,返回true,如果不是,返回flase,假设没有重复的元素. 思路: ...

  7. 《剑指offer》第三十五题(复杂链表的复制)

    // 面试题35:复杂链表的复制 // 题目:请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复 // 制一个复杂链表.在复杂链表中,每个结点除 ...

  8. 简直offer-第四章解决面试题思路(二叉树中和为某一值的路径)

    题目:输入一颗二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径.从树的根节点往下一直到叶子节点形成一条路径. 思路:很明显用前序遍历可以从根节点开始遍历到叶子节点,然后将遍历的节点添加到 ...

  9. 剑指offer第五章

    剑指offer第五章 1.数组中出现次数超过一半的数 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组 ...

随机推荐

  1. IntelliJ Idea 常用功能及其快捷键总结(长期更新,纯手动)

    基础功能总结 快捷键总结 全局搜索 CTRL SHIF F 局部搜索 CTRL F 替换 CTRL R 复制一行 CTRL D 剪切一行 CTRL X 行定位 CTRL G 文件重命名 SHIFT F ...

  2. 防盗链&CSRF&API接口幂等性设计

    防盗链技术 CSRF(模拟请求) 分析防止伪造Token请求攻击 互联网API接口幂等性设计 忘记密码漏洞分析 1.Http请求防盗链 什么是防盗链 比如A网站有一张图片,被B网站直接通过img标签属 ...

  3. Effective C++ 条款12:复制对象时勿忘其每一个成分

    void logCall(const std::string& funcName); class Customer { public: ... Customer (const Customer ...

  4. hibernate-Table 'XXX.XXX' doesn't exist

    hibernate---Table 'XXX.XXX' doesn't exist 在设置自动生成数据表的策略中: <!-- 自动生成数据表的策略 --> <property nam ...

  5. DDOS 攻击工具

    DDOS  攻击工具 使用github上的DDOS攻击工具 https://github.com/Ha3MrX/DDos-Attack 将python脚本拷贝到主机,使用 chmod +x ddos- ...

  6. WPF的外观装饰类——Border

    public class Border : System.Windows.Controls.Decorator 说明:在另一个元素的周围绘制边框.背景或同时绘制二者.

  7. Confluence 6 配置系统属性

    在这个页面中描述 Confluence 启动时如何设置 Java 属性和其他选项. 请查看 How to fix out of memory errors by increasing availabl ...

  8. 列出远程git的全部分支

    列出全部分支 git ls-remote --heads your.git | awk 'sub(/refs\/heads\//,""){print $2}' 其中awk中sub替 ...

  9. JAVA定时任务Timer

    故事起因 因业务需要,写了一个定时任务Timer,任务将在每天的凌晨2点执行,代码顺利码完,一切就绪,开始测试.运行程序,为了节省时间,将系统时间调整为第二天凌晨1点59分,看着秒针滴答滴答的转动,期 ...

  10. OpenCV几种边缘检测的简例

    简单记录一下OpenCV的几种边缘检测函数的用法. 边缘检测算法 以Sobel边缘检测算法为例. Sobel卷积核模板为: 偏导公式为: Gx(i,j)=[f(i+1,j−1)+2f(i+1,j)+f ...