您的位置:首页 > 编程语言 > Java开发

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
-----------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: