题目:复制一个复杂链表。在复杂链表中,每个节点除了有一个pNext指针域指向下一个节点,还有一个pSibling指针指向链表中任意一个节点,节点定义如下:
class ComplexList{
public int data;
public ComplexList pNext;
public ComplexList pSibling;
public ComplexList(int data){
this.data=data;
}
}
复制方法分为三步,在此之前先建立一个初始的复杂链表:
private static ComplexList createComplexList() {
// TODO Auto-generated method stub
ComplexList head=new ComplexList(1);
ComplexList node=head;
for(int i=2;i<=5;i++){
node.pNext=new ComplexList(i);
node.pSibling=null;
node=node.pNext;
}
node=head;
node.pSibling=node.pNext.pNext;
node.pSibling.pNext.pSibling=node.pNext;
node.pNext.pSibling=node.pSibling.pNext.pNext;
return head;
}
复杂链表建成之后如图:
第一步:根据原始链表建立每个节点的复制节点:
private static void cloneNode(ComplexList list) {
// TODO Auto-generated method stub
ComplexList temp=list;
while(temp!=null){
ComplexList clone=new ComplexList(temp.data); //在原来的节点后建一个data域相同的节点
clone.pNext=temp.pNext; //并将原来的next域指向新节点
clone.pSibling=null;
temp.pNext=clone;
temp=clone.pNext;
}
}
第二步:设置复制出来的节点的pSibling,假设原始节点的i指向节点j,那么对应复制出来的i^是i的next指向的节点,同时s^也是s的next节点,即复制复制后链表的pSibling指针的指向。
private static void connectSibling(ComplexList list) {
// TODO Auto-generated method stub
ComplexList temp=list;
while(temp!=null){
ComplexList clone=temp.pNext; //temp为复制后的节点
if(temp.pSibling!=null){ //如果原节点有Sibling域,则将复制后的节点的Sibling域指向原节点的Sibling域指向的节点的复制节点
clone.pSibling=temp.pSibling.pNext;
}
temp=clone.pNext;
}
}
第三步:把原始链表和复制链表分开:
private static ComplexList ReconnectNode(ComplexList list) {
// TODO Auto-generated method stub
ComplexList temp=null;
ComplexList clone=null; //复制后的链表
if(list!=null){
temp=clone=list.pNext; //复制后链表的第一个节点
list.pNext=temp.pNext; //解除复制节点与原节点的链接
list=temp.pNext;
}
while(list!=null){
temp.pNext=list.pNext; //temp节点代表复制链表的每个节点
temp=temp.pNext; //找到复制链表的下一个节点
list.pNext=temp.pNext; //解除复制节点与原节点的链接
list=list.pNext; //原链表的下一个节点
}
return clone;
}
主函数调用顺序为:
public static void main(String[] args) {
// TODO Auto-generated method stub
ComplexList list=createComplexList(); //创建一个复杂链表
ComplexList newlist=Clone(list);
while(newlist!=null){
System.out.print(newlist.data);
if(newlist.pSibling!=null){
System.out.print(newlist.pSibling.data);
}
System.out.println();
newlist=newlist.pNext;
}
}