P147、面试题26:复杂链表的复制
题目:请实现ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表。在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibing指向链表中的任意结点或者null。
struct ComplexListNode{
int m_nValue;
ComplexListNode* m_pNext;
ComplexListNode* m_pSibling;
}
分析思路:
package com.yyq;
/**
* Created by Administrator on 2015/9/20.
*/
public class CopyComplexList {
//第一步:复制每个结点
public static void cloneNodes(ComplexListNode pHead){
ComplexListNode pNode = pHead;
while(pNode != null){
ComplexListNode pCloned = new ComplexListNode();
pCloned.setM_nValue(pNode.getM_nValue());
pCloned.setM_pNext(pNode.getM_pNext());
pNode.setM_pNext(pCloned);
pNode = pCloned.getM_pNext();
}
}
//第二步:复制m_pSibling结点
public static void connectSiblingNodes(ComplexListNode pHead){
ComplexListNode pNode = pHead;
while (pNode != null){
ComplexListNode pCloned = pNode.getM_pNext();
if (pNode.getM_pSibling() != null){
pCloned.setM_pSibling(pNode.getM_pSibling().getM_pNext());
}
pNode = pCloned.getM_pNext();
}
}
//第三步:将这个长链表分成两个表
public static ComplexListNode reconnectNodes(ComplexListNode pHead){
ComplexListNode pNode = pHead;
ComplexListNode pClonedHead = null;
ComplexListNode pClonedNode = null;
if (pNode != null){
pClonedHead = pNode.getM_pNext();
pClonedNode = pNode.getM_pNext();
pNode.setM_pNext(pClonedNode.getM_pNext());
pNode = pNode.getM_pNext();
}
while(pNode != null){
pClonedNode.setM_pNext(pNode.getM_pNext());
pClonedNode = pClonedNode.getM_pNext();
pNode.setM_pNext(pClonedNode.getM_pNext());
pNode = pNode.getM_pNext();
}
return pClonedHead;
}
public static ComplexListNode clone(ComplexListNode pHead){
cloneNodes(pHead);
connectSiblingNodes(pHead);
return reconnectNodes(pHead);
}
// ====================测试代码====================
public static void Test(String testName, ComplexListNode pHead)
{
if(testName != null)
System.out.println(testName + " begins:");
System.out.println("The original list is:");
ComplexListNode pNode = new ComplexListNode();
pNode.printListNode(pHead);
ComplexListNode pClonedHead = clone(pHead);
System.out.println("The cloned list is:");
pNode.printListNode(pClonedHead);
}
// -----------------
// \|/ |
// 1-------2-------3-------4-------5
// | | /|\ /|\
// --------+-------- |
// -------------------------
public static void Test1()
{
ComplexListNode pNode1 = new ComplexListNode(1);
ComplexListNode pNode2 = new ComplexListNode(2);
ComplexListNode pNode3 = new ComplexListNode(3);
ComplexListNode pNode4 = new ComplexListNode(4);
ComplexListNode pNode5 = new ComplexListNode(5);
pNode1.buildNodes(pNode2, pNode3);
pNode2.buildNodes(pNode3, pNode5);
pNode3.buildNodes(pNode4, null);
pNode4.buildNodes(pNode5, pNode2);
Test("Test1", pNode1);
}
// m_pSibling指向结点自身
// -----------------
// \|/ |
// 1-------2-------3-------4-------5
// | | /|\ /|\
// | | -- |
// |------------------------|
public static void Test2()
{
ComplexListNode pNode1 = new ComplexListNode(1);
ComplexListNode pNode2 = new ComplexListNode(2);
ComplexListNode pNode3 = new ComplexListNode(3);
ComplexListNode pNode4 = new ComplexListNode(4);
ComplexListNode pNode5 = new ComplexListNode(5);
pNode1.buildNodes(pNode2, null);
pNode2.buildNodes(pNode3, pNode5);
pNode3.buildNodes(pNode4, pNode3);
pNode4.buildNodes(pNode5, pNode2);
Test("Test2", pNode1);
}
// m_pSibling形成环
// -----------------
// \|/ |
// 1-------2-------3-------4-------5
// | /|\
// | |
// |---------------|
public static void Test3()
{
ComplexListNode pNode1 = new ComplexListNode(1);
ComplexListNode pNode2 = new ComplexListNode(2);
ComplexListNode pNode3 = new ComplexListNode(3);
ComplexListNode pNode4 = new ComplexListNode(4);
ComplexListNode pNode5 = new ComplexListNode(5);
pNode1.buildNodes(pNode2, null);
pNode2.buildNodes(pNode3, pNode4);
pNode3.buildNodes(pNode4, null);
pNode4.buildNodes(pNode5, pNode2);
Test("Test3", pNode1);
}
// 只有一个结点
public static void Test4()
{
ComplexListNode pNode1 = new ComplexListNode(1);
pNode1.buildNodes(null, pNode1);
Test("Test4", pNode1);
}
// 鲁棒性测试
public static void Test5()
{
Test("Test5", null);
}
public static void main(String[] args)
{
Test1();
Test2();
Test3();
Test4();
Test5();
}
}
P147、面试题26:复杂链表的复制的更多相关文章
- 《剑指offer》面试题26 复杂链表的复制 Java版
(定义一个新的数据结构,每个节点除了具有普通链表的next域外,还有一个额外的引用指向任意节点.我们要对由该特殊数据结构形成的链表进行复制.) 我的方法:也就是克隆一个这种特殊链表,很快想到先不考虑原 ...
- 剑指offer-面试题35-复杂链表的复制-链表
/* 题目: 实现一个函数,复制复杂链表,返回复制链表的头节点. */ /* 思路: 第一步,复制一个链表S‘,插在原链表S中. 第二步,链表S’复制链表S的random指针. 第三步:拆分链表S和S ...
- 剑指offer面试题26-复杂链表的复制
题目: 请实现函数ComplexListNode* Clone(ComplexListNode* pHead).复制一个复杂链表. 在复杂链表中.每个节点除了一个m_pNext指针指向下一个节点外,另 ...
- 《剑指offer》面试题35. 复杂链表的复制
问题描述 请实现 copyRandomList 函数,复制一个复杂链表.在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null. ...
- 剑指offer 面试题35.复杂链表的复制
时间O(N),空间O(N) /* struct RandomListNode { int label; struct RandomListNode *next, *random; RandomList ...
- (剑指Offer)面试题26:复杂链表的复制
题目: 请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表. 在复杂链表中,每个结点除了有一个pNext指针指向下一个结点之外,还 ...
- 剑指offer面试题26:复杂链表的复制
题目:请实现一个函数,复制一个复杂链表. 在复杂链表中,每个结点除了有一个next指针指向下一个结点外,还有一个sibling指针指向链表中的任意结点或者nulL 直观解法: 1.遍历链表,复制链表节 ...
- 【剑指Offer学习】【面试题26:复杂链表的复制】
题目:请实现函数ComplexListNode clone(ComplexListNode head),复制一个复杂链表. 在复杂链表中,每一个结点除了有一个next 域指向下一个结点外,另一个sib ...
- 剑指Offer面试题:24.复杂链表的复制
一.题目:复杂链表的复制 题目:请实现函数ComplexListNode Clone(ComplexListNode head),复制一个复杂链表.在复杂链表中,每个结点除了有一个Next指针指向下一 ...
- 剑指offer-第四章解决面试题思路(复杂链表的复制)
题目:请写一个函数clone(ComplexListNode pHead),实现复杂链表的复制. 复杂链表的数据结构如下:public class ComplexListNode{int m_nVal ...
随机推荐
- HLG 1400 汽车比赛
题目链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1400 结构体排序+树状数 ...
- CCNA第一讲笔记
园区网:一组连续的局域网(校园网.企业内部网) 园区网拓扑: 一层楼的PC连接到一台交换机(同一层的PC可以互联):一栋楼的每层的交换机连接到同一台交换机(整栋楼的PC可以互联):每栋楼的交换机连接到 ...
- Maven使用总结
1.pom.xml文件中添加新的库 在中央仓库找不到你想要的jar的时候,可以在pom.xml中添加附加的库,语法如下 <repositories> <repository> ...
- StreamReader和StreamWrite与FileStream区别
具体用法不在赘述. 记录一下用法的区别 StreamReader: FileStream fs = new FileStream(@"D:\Readme.txt",FileMode ...
- 处理部分WordPress核心代码或功能,让你的网站更快
处理部分WordPress核心代码或功能,让你的网站更快 http://www.wpdaxue.com/speed-up-wordpress.html
- 使用commons-fileUpload组件上传文件
在近期的一个项目中有用到commons-fileUpload组件进行实现文件上传的功能(由于没用到框架),在使用的过程中有遇到一些问题,经过自己的琢磨也算顺利地将其解决了,在这里做个记录. 一.com ...
- SpotLight的下载地址以及注册码可供参考
ToadDBASuiteforOracle_101R2.exe 试用版http://worlddownloads.quest.com.edgesuite.net/Repository/www.ques ...
- H264相关代码
H.264格式的视频打包成RTP后进行发送,编译环境为VC6++ #include <stdio.h> #include <stdlib.h> #include <str ...
- Kinetic使用注意点--collection
new Collection() 扩展了数组,主要用于配合new Container().get()使用 方法: each(func):遍历数组,执行回调函数.回调函数接收两个值,节点和索引. toA ...
- JAVA中的各种 哈希码(HashCode) 与 equals方法在HIBERNATE的实际应用[转载]
1.什么是哈希码(HashCode) 在Java中,哈希码代表对象的特征.例如对象 Java代码 String str1 = “aa”, str1.hashCode= 3104 String str2 ...