剑指offer-第四章解决面试题思路(复杂链表的复制)
题目:请写一个函数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); } }