java 复制复杂链表
2016-04-20 20:41
399 查看
思路:
代码分三个步骤:第一步
CloneNodes()
,第二步ConnectSiblingNodes(),第三步ReconnectNodes()
,每步作用如图1:
图 1 复制链表思路
链表结构如图:
图 2 原链表结构
代码如下:两个类
ComplexNode 类,链表节点类
package AlgorithmComplexLinkedList;
public class ComplexNode {
public int m_nValue; // 节点 value
public ComplexNode m_pNext = null; //下一个节点
public ComplexNode m_pSibling = null; //random 指针
public ComplexNode(int m_nValue) {
this.m_nValue = m_nValue;
}
public ComplexNode(int m_nValue, ComplexNode m_pNext, ComplexNode m_pSibling) {
this.m_nValue = m_nValue;
this.m_pNext = m_pNext;
this.m_pSibling = m_pSibling;
}
}
ComplexLinkListOperate 类,链表操作类
package AlgorithmComplexLinkedList;
public class ComplexLinkListOperate {
public static ComplexLinkListOperate instance = null;
public static ComplexLinkListOperate getInstance() {
if(instance == null)
return new ComplexLinkListOperate();
return instance;
}
public ComplexNode createComplexLinkList() {
ComplexNode pHead ;
ComplexNode pFirst = new ComplexNode(1);
ComplexNode pSecond = new ComplexNode(2);
ComplexNode pThird = new ComplexNode(3);
ComplexNode pFourth = new ComplexNode(4);
ComplexNode pFifth = new ComplexNode(5);
pFirst.m_pNext = pSecond;
pSecond.m_pNext = pThird;
pThird.m_pNext = pFourth;
pFourth.m_pNext = pFifth;
pFifth.m_pNext = null;
pFirst.m_pSibling = pThird;
pSecond.m_pSibling = pFirst;
pThird.m_pSibling = pThird;
pFourth.m_pSibling = pThird;
pFifth.m_pSibling = pSecond;
pHead = pFirst;
return pHead;
}
public void CloneNodes(ComplexNode pHead) {
ComplexNode pNode = pHead;
while(pNode != null) {
ComplexNode pNewNode = new ComplexNode(pNode.m_nValue);
pNewNode.m_pNext = pNode.m_pNext;
pNewNode.m_pSibling = null;
pNode.m_pNext = pNewNode;
pNode = pNewNode.m_pNext;
}
}
public void ConnectSiblingNodes(ComplexNode pHead) {
ComplexNode pNode = pHead;
while(pNode != null) {
if(pNode.m_pSibling != null) {
pNode.m_pNext.m_pSibling = pNode.m_pSibling.m_pNext;
}
pNode = pNode.m_pNext.m_pNext;
}
}
public ComplexNode ReconnectNodes(ComplexNode pHead) {
if(pHead==null)
return null;
ComplexNode pCloneHead = pHead.m_pNext;
ComplexNode pNode = pHead;
ComplexNode pCloneNode = pCloneHead;
while(pCloneNode.m_pNext != null) {
pNode.m_pNext = pCloneNode.m_pNext;
pNode = pNode.m_pNext;
pCloneNode.m_pNext = pNode.m_pNext;
pCloneNode = pCloneNode.m_pNext;
}
pNode.m_pNext = null;
return pCloneHead;
}
public ComplexNode clone(ComplexNode pHead) {
CloneNodes(pHead);
ConnectSiblingNodes(pHead);
ComplexNode pCloneHead = ReconnectNodes(pHead);
return pCloneHead;
}
public void print(ComplexNode pHead) {
ComplexNode pNode = pHead;
while(pNode != null) {
int m_nValue = pNode.m_nValue;
ComplexNode m_pNext = pNode.m_pNext;
ComplexNode m_pSibling = pNode.m_pSibling;
System.out.println("-----------------------------");
System.out.println(pNode);
System.out.println(m_nValue);
System.out.println(m_pNext != null ? m_pNext.toString() : "null");
System.out.println(m_pSibling != null ? m_pSibling.toString() : "null");
System.out.println("-----------------------------");
pNode = pNode.m_pNext;
}
}
public static void main(String[] args) {
//原链表为:pHead
ComplexNode pHead = ComplexLinkListOperate.getInstance().createComplexLinkList();
//新链表为:pClonedHead
ComplexNode pCloneHead = ComplexLinkListOperate.getInstance().clone(pHead);
System.out.println("原链表为:");
ComplexLinkListOperate.getInstance().print(pHead);
System.out.println("新链表为:");
ComplexLinkListOperate.getInstance().print(pCloneHead);
}
}
复制结果:
原链表为:
本节点:AlgorithmComplexLinkedList.ComplexNode@2524e205
值:1
next 节点: AlgorithmComplexLinkedList.ComplexNode@1872c950
sibling 节点: AlgorithmComplexLinkedList.ComplexNode@17feafba
-----------------------------
本节点:AlgorithmComplexLinkedList.ComplexNode@1872c950
值:2
next 节点: AlgorithmComplexLinkedList.ComplexNode@17feafba
sibling 节点: AlgorithmComplexLinkedList.ComplexNode@2524e205
-----------------------------
本节点:AlgorithmComplexLinkedList.ComplexNode@17feafba
值:3
next 节点: AlgorithmComplexLinkedList.ComplexNode@51c2e8a4
sibling 节点: AlgorithmComplexLinkedList.ComplexNode@17feafba
-----------------------------
本节点:AlgorithmComplexLinkedList.ComplexNode@51c2e8a4
值:4
next 节点: AlgorithmComplexLinkedList.ComplexNode@533790eb
sibling 节点: AlgorithmComplexLinkedList.ComplexNode@17feafba
-----------------------------
本节点:AlgorithmComplexLinkedList.ComplexNode@533790eb
值:5
next 节点: null
sibling 节点: AlgorithmComplexLinkedList.ComplexNode@1872c950
-----------------------------
新链表为:
本节点:AlgorithmComplexLinkedList.ComplexNode@650b5efb
值:1
next 节点: AlgorithmComplexLinkedList.ComplexNode@4d88e490
sibling 节点: AlgorithmComplexLinkedList.ComplexNode@5655d1b4
-----------------------------
本节点:AlgorithmComplexLinkedList.ComplexNode@4d88e490
值:2
next 节点: AlgorithmComplexLinkedList.ComplexNode@5655d1b4
sibling 节点: AlgorithmComplexLinkedList.ComplexNode@650b5efb
-----------------------------
本节点:AlgorithmComplexLinkedList.ComplexNode@5655d1b4
值:3
next 节点: AlgorithmComplexLinkedList.ComplexNode@1c3aacb4
sibling 节点: AlgorithmComplexLinkedList.ComplexNode@5655d1b4
-----------------------------
本节点:AlgorithmComplexLinkedList.ComplexNode@1c3aacb4
值:4
next 节点: AlgorithmComplexLinkedList.ComplexNode@50206be6
sibling 节点: AlgorithmComplexLinkedList.ComplexNode@5655d1b4
-----------------------------
本节点:AlgorithmComplexLinkedList.ComplexNode@50206be6
值:5
next 节点: null
sibling 节点: AlgorithmComplexLinkedList.ComplexNode@4d88e490
-----------------------------
代码分三个步骤:第一步
CloneNodes()
,第二步ConnectSiblingNodes(),第三步ReconnectNodes()
,每步作用如图1:
图 1 复制链表思路
链表结构如图:
图 2 原链表结构
代码如下:两个类
ComplexNode 类,链表节点类
package AlgorithmComplexLinkedList;
public class ComplexNode {
public int m_nValue; // 节点 value
public ComplexNode m_pNext = null; //下一个节点
public ComplexNode m_pSibling = null; //random 指针
public ComplexNode(int m_nValue) {
this.m_nValue = m_nValue;
}
public ComplexNode(int m_nValue, ComplexNode m_pNext, ComplexNode m_pSibling) {
this.m_nValue = m_nValue;
this.m_pNext = m_pNext;
this.m_pSibling = m_pSibling;
}
}
ComplexLinkListOperate 类,链表操作类
package AlgorithmComplexLinkedList;
public class ComplexLinkListOperate {
public static ComplexLinkListOperate instance = null;
public static ComplexLinkListOperate getInstance() {
if(instance == null)
return new ComplexLinkListOperate();
return instance;
}
public ComplexNode createComplexLinkList() {
ComplexNode pHead ;
ComplexNode pFirst = new ComplexNode(1);
ComplexNode pSecond = new ComplexNode(2);
ComplexNode pThird = new ComplexNode(3);
ComplexNode pFourth = new ComplexNode(4);
ComplexNode pFifth = new ComplexNode(5);
pFirst.m_pNext = pSecond;
pSecond.m_pNext = pThird;
pThird.m_pNext = pFourth;
pFourth.m_pNext = pFifth;
pFifth.m_pNext = null;
pFirst.m_pSibling = pThird;
pSecond.m_pSibling = pFirst;
pThird.m_pSibling = pThird;
pFourth.m_pSibling = pThird;
pFifth.m_pSibling = pSecond;
pHead = pFirst;
return pHead;
}
public void CloneNodes(ComplexNode pHead) {
ComplexNode pNode = pHead;
while(pNode != null) {
ComplexNode pNewNode = new ComplexNode(pNode.m_nValue);
pNewNode.m_pNext = pNode.m_pNext;
pNewNode.m_pSibling = null;
pNode.m_pNext = pNewNode;
pNode = pNewNode.m_pNext;
}
}
public void ConnectSiblingNodes(ComplexNode pHead) {
ComplexNode pNode = pHead;
while(pNode != null) {
if(pNode.m_pSibling != null) {
pNode.m_pNext.m_pSibling = pNode.m_pSibling.m_pNext;
}
pNode = pNode.m_pNext.m_pNext;
}
}
public ComplexNode ReconnectNodes(ComplexNode pHead) {
if(pHead==null)
return null;
ComplexNode pCloneHead = pHead.m_pNext;
ComplexNode pNode = pHead;
ComplexNode pCloneNode = pCloneHead;
while(pCloneNode.m_pNext != null) {
pNode.m_pNext = pCloneNode.m_pNext;
pNode = pNode.m_pNext;
pCloneNode.m_pNext = pNode.m_pNext;
pCloneNode = pCloneNode.m_pNext;
}
pNode.m_pNext = null;
return pCloneHead;
}
public ComplexNode clone(ComplexNode pHead) {
CloneNodes(pHead);
ConnectSiblingNodes(pHead);
ComplexNode pCloneHead = ReconnectNodes(pHead);
return pCloneHead;
}
public void print(ComplexNode pHead) {
ComplexNode pNode = pHead;
while(pNode != null) {
int m_nValue = pNode.m_nValue;
ComplexNode m_pNext = pNode.m_pNext;
ComplexNode m_pSibling = pNode.m_pSibling;
System.out.println("-----------------------------");
System.out.println(pNode);
System.out.println(m_nValue);
System.out.println(m_pNext != null ? m_pNext.toString() : "null");
System.out.println(m_pSibling != null ? m_pSibling.toString() : "null");
System.out.println("-----------------------------");
pNode = pNode.m_pNext;
}
}
public static void main(String[] args) {
//原链表为:pHead
ComplexNode pHead = ComplexLinkListOperate.getInstance().createComplexLinkList();
//新链表为:pClonedHead
ComplexNode pCloneHead = ComplexLinkListOperate.getInstance().clone(pHead);
System.out.println("原链表为:");
ComplexLinkListOperate.getInstance().print(pHead);
System.out.println("新链表为:");
ComplexLinkListOperate.getInstance().print(pCloneHead);
}
}
复制结果:
原链表为:
本节点:AlgorithmComplexLinkedList.ComplexNode@2524e205
值:1
next 节点: AlgorithmComplexLinkedList.ComplexNode@1872c950
sibling 节点: AlgorithmComplexLinkedList.ComplexNode@17feafba
-----------------------------
本节点:AlgorithmComplexLinkedList.ComplexNode@1872c950
值:2
next 节点: AlgorithmComplexLinkedList.ComplexNode@17feafba
sibling 节点: AlgorithmComplexLinkedList.ComplexNode@2524e205
-----------------------------
本节点:AlgorithmComplexLinkedList.ComplexNode@17feafba
值:3
next 节点: AlgorithmComplexLinkedList.ComplexNode@51c2e8a4
sibling 节点: AlgorithmComplexLinkedList.ComplexNode@17feafba
-----------------------------
本节点:AlgorithmComplexLinkedList.ComplexNode@51c2e8a4
值:4
next 节点: AlgorithmComplexLinkedList.ComplexNode@533790eb
sibling 节点: AlgorithmComplexLinkedList.ComplexNode@17feafba
-----------------------------
本节点:AlgorithmComplexLinkedList.ComplexNode@533790eb
值:5
next 节点: null
sibling 节点: AlgorithmComplexLinkedList.ComplexNode@1872c950
-----------------------------
新链表为:
本节点:AlgorithmComplexLinkedList.ComplexNode@650b5efb
值:1
next 节点: AlgorithmComplexLinkedList.ComplexNode@4d88e490
sibling 节点: AlgorithmComplexLinkedList.ComplexNode@5655d1b4
-----------------------------
本节点:AlgorithmComplexLinkedList.ComplexNode@4d88e490
值:2
next 节点: AlgorithmComplexLinkedList.ComplexNode@5655d1b4
sibling 节点: AlgorithmComplexLinkedList.ComplexNode@650b5efb
-----------------------------
本节点:AlgorithmComplexLinkedList.ComplexNode@5655d1b4
值:3
next 节点: AlgorithmComplexLinkedList.ComplexNode@1c3aacb4
sibling 节点: AlgorithmComplexLinkedList.ComplexNode@5655d1b4
-----------------------------
本节点:AlgorithmComplexLinkedList.ComplexNode@1c3aacb4
值:4
next 节点: AlgorithmComplexLinkedList.ComplexNode@50206be6
sibling 节点: AlgorithmComplexLinkedList.ComplexNode@5655d1b4
-----------------------------
本节点:AlgorithmComplexLinkedList.ComplexNode@50206be6
值:5
next 节点: null
sibling 节点: AlgorithmComplexLinkedList.ComplexNode@4d88e490
-----------------------------
相关文章推荐
- Java中的instanceof关键字
- Java 8 Stream
- struts原理之xwork
- 阿里巴巴2016java研发笔试附加题
- 【JUC】JDK1.8源码分析之CountDownLatch(五)
- SpringMvc中自动注入失败原因
- Java 爬虫入门(网易云音乐和知乎实例)
- JAVA继承关系中构造方法的调用次序详解
- Myeclipse下web项目图片加载不出来
- 六大设计原则(3)接口隔离原则
- java--web.xml中url-pattern的映射规则
- java并发-ThreadLocal
- java--Servlet操作注意事项
- 在MyEclipse中上传项目到github的步骤(很详细)
- java设计模式之简单工厂模式
- Java 字节流与字符流的区别
- 单例模式的创建(Java版)
- 获取java方法签名
- Java反射实现接口
- Java NIO写事件处理技巧