题目:请实现ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表。在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibing指向链表中的任意结点或者null。
struct ComplexListNode{
      int      m_nValue;
      ComplexListNode*     m_pNext;
      ComplexListNode*     m_pSibling;
}

分析思路:

第一步是根据原始链表的每个结点N创建对应的N',但是是把N'链接在N的后面。
第二步是设置复制出来的结点的m_pSibling。假设原始链表上的N的m_pSibling指向结点S,那么其对应复制出来的N'是N的m_pNext指向的结点,同样S'也是S的m_pNext指向的结点。
第三步是把这个长链表拆分成两个链表:把奇数位置的结点用m_pNext链接起来就是原始链表,把偶数位置的结点用m_pNext链接起来就是复制出来的链表。
 
测试用例:
1)功能测试(包括结点中的m_pSibling指向结点自身,两个结点的m_pSibling形成环状结构,链表中只有一个结点);
2)特殊输入测试(指向链表头结点的指针为null指针)。
 
代码实现:
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();
}
}
 
结果输出:
Test1 begins:
The original list is:
The value of this node is: 1
The value of its sibling is: 3
 
The value of this node is: 2
The value of its sibling is: 5
 
The value of this node is: 3
This node does not have a sibling.
 
The value of this node is: 4
The value of its sibling is: 2
 
The value of this node is: 5
This node does not have a sibling.
 
The cloned list is:
The value of this node is: 1
The value of its sibling is: 3
 
The value of this node is: 2
The value of its sibling is: 5
 
The value of this node is: 3
This node does not have a sibling.
 
The value of this node is: 4
The value of its sibling is: 2
 
The value of this node is: 5
This node does not have a sibling.
 
Test2 begins:
The original list is:
The value of this node is: 1
This node does not have a sibling.
 
The value of this node is: 2
The value of its sibling is: 5
 
The value of this node is: 3
The value of its sibling is: 3
 
The value of this node is: 4
The value of its sibling is: 2
 
The value of this node is: 5
This node does not have a sibling.
 
The cloned list is:
The value of this node is: 1
This node does not have a sibling.
 
The value of this node is: 2
The value of its sibling is: 5
 
The value of this node is: 3
The value of its sibling is: 3
 
The value of this node is: 4
The value of its sibling is: 2
 
The value of this node is: 5
This node does not have a sibling.
 
Test3 begins:
The original list is:
The value of this node is: 1
This node does not have a sibling.
 
The value of this node is: 2
The value of its sibling is: 4
 
The value of this node is: 3
This node does not have a sibling.
 
The value of this node is: 4
The value of its sibling is: 2
 
The value of this node is: 5
This node does not have a sibling.
 
The cloned list is:
The value of this node is: 1
This node does not have a sibling.
 
The value of this node is: 2
The value of its sibling is: 4
 
The value of this node is: 3
This node does not have a sibling.
 
The value of this node is: 4
The value of its sibling is: 2
 
The value of this node is: 5
This node does not have a sibling.
 
Test4 begins:
The original list is:
The value of this node is: 1
The value of its sibling is: 1
 
The cloned list is:
The value of this node is: 1
The value of its sibling is: 1
 
Test5 begins:
The original list is:
The cloned list is:

P147、面试题26:复杂链表的复制的更多相关文章

  1. 《剑指offer》面试题26 复杂链表的复制 Java版

    (定义一个新的数据结构,每个节点除了具有普通链表的next域外,还有一个额外的引用指向任意节点.我们要对由该特殊数据结构形成的链表进行复制.) 我的方法:也就是克隆一个这种特殊链表,很快想到先不考虑原 ...

  2. 剑指offer-面试题35-复杂链表的复制-链表

    /* 题目: 实现一个函数,复制复杂链表,返回复制链表的头节点. */ /* 思路: 第一步,复制一个链表S‘,插在原链表S中. 第二步,链表S’复制链表S的random指针. 第三步:拆分链表S和S ...

  3. 剑指offer面试题26-复杂链表的复制

    题目: 请实现函数ComplexListNode* Clone(ComplexListNode* pHead).复制一个复杂链表. 在复杂链表中.每个节点除了一个m_pNext指针指向下一个节点外,另 ...

  4. 《剑指offer》面试题35. 复杂链表的复制

    问题描述 请实现 copyRandomList 函数,复制一个复杂链表.在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null. ...

  5. 剑指offer 面试题35.复杂链表的复制

    时间O(N),空间O(N) /* struct RandomListNode { int label; struct RandomListNode *next, *random; RandomList ...

  6. (剑指Offer)面试题26:复杂链表的复制

    题目: 请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表. 在复杂链表中,每个结点除了有一个pNext指针指向下一个结点之外,还 ...

  7. 剑指offer面试题26:复杂链表的复制

    题目:请实现一个函数,复制一个复杂链表. 在复杂链表中,每个结点除了有一个next指针指向下一个结点外,还有一个sibling指针指向链表中的任意结点或者nulL 直观解法: 1.遍历链表,复制链表节 ...

  8. 【剑指Offer学习】【面试题26:复杂链表的复制】

    题目:请实现函数ComplexListNode clone(ComplexListNode head),复制一个复杂链表. 在复杂链表中,每一个结点除了有一个next 域指向下一个结点外,另一个sib ...

  9. 剑指Offer面试题:24.复杂链表的复制

    一.题目:复杂链表的复制 题目:请实现函数ComplexListNode Clone(ComplexListNode head),复制一个复杂链表.在复杂链表中,每个结点除了有一个Next指针指向下一 ...

  10. 剑指offer-第四章解决面试题思路(复杂链表的复制)

    题目:请写一个函数clone(ComplexListNode pHead),实现复杂链表的复制. 复杂链表的数据结构如下:public class ComplexListNode{int m_nVal ...

随机推荐

  1. Java中的栈:java.util.Stack类

    public class Stack<E>extends Vector<E>Stack 类表示后进先出(LIFO)的对象堆栈.它通过五个操作对类 Vector 进行了扩展 ,允 ...

  2. Cassandra1.2文档学习(19)—— CQL索引

    参考文档:http://www.datastax.com/documentation/cql/3.0/webhelp/index.html#cql/ddl/ddl_primary_index_c.ht ...

  3. Apache+PHP+MySql 的安装及配置

    每一项技术用的人多了,就会有人将其进行优化,做成一个简单.实用.大众化的工具,这对于初识者来说是非常方便的,但是对于长久学习或工作这方面的人技术人员来说是不可取的,所以还是要学习基础的实用方法.因此, ...

  4. 关于HTML代码的转义

    笔记: 1.在通过jsonp方式传输HTML代码的时候,为了防止代码中的一些字符影响json的语法,需要对HTML代码进行转义. 2.转义的时候可以只转义特殊字符(引号之类的),也可以把所有字符(中文 ...

  5. String类中的equals()方法

    在Java中,每一个对象都有一个地址空间,在这空间保存着这个对象的值. equals 比较的是值,==比较的地址以及值. 01: public class StringExample02: {03: ...

  6. 反射自动填充model

    public static T FillModel<T>(DataRow dr) { ) return default(T); T model = Activator.CreateInst ...

  7. 2734: [HNOI2012]集合选数 - BZOJ

    Description <集合论与图论>这门课程有一道作业题,要求同学们求出{1, 2, 3, 4, 5}的所有满足以 下条件的子集:若 x 在该子集中,则 2x 和 3x 不能在该子集中 ...

  8. 1206: [HNOI2005]虚拟内存 - BZOJ

    Description 操作系统中一种重要的存储管理技术就是虚拟内存技术.操作系统中允许进程同时运行,也就是并行.每个进程都有其相对独立的数据块(进程运行的过程中将对其进行读写操作).理想的情况下,这 ...

  9. VS2012编译出来的程序,在XP上运行,出现“.exe 不是有效的 win32 应用程序” “not a valid win32 application”

    升级vs2010到vs2012,突然发现build出来的应用程序无法运行,提示“不是有效的 win32 应用程序” or “not a valid win32 application”. 参考CSDN ...

  10. WEB开发者必备的7个JavaScript函数

    防止高频调用的debounce函数 这个 debounce 函数对于那些执行事件驱动的任务来说是必不可少的提高性能的函数.如果你在使用scroll, resize, key*等事件触发执行任务时不使用 ...