题目:
请实现函数ComplexListNode(LinkNode head),复制一个复杂链表。在复杂链表中,出了有Next指针意外,还有一个Sibling指向链表中的任意节点或者Null,节点定义如下:
public class LinkNode{
public int data;
public LinkNode next;
public LinkNode subLing;
}
输入:
头插法的单链表序列(4,3,2,1)
输出:
4321
解题思路:
1、复制链表到单链表序列的后面
2、辅助Sibling的值
3、把一个链表分解成两个
Java实现代码:
public static void main(String[] args) {
// TODO Auto-generated method stub
Linked linked=new Linked();
LinkNode node1=new LinkNode(4);
LinkNode node2=new LinkNode(3);
LinkNode node3=new LinkNode(2);
LinkNode node4=new LinkNode(1);
node1.subLing=node3;
node1.subLing=node1;
linked.insertFirst(node1);
linked.insertFirst(node2);
linked.insertFirst(node3);
linked.insertFirst(node4);
linked.display(ComplexListNode(linked.header));
}
private static LinkNode ComplexListNode(LinkNode node){
cloneNode(node);
setCloneNodeSiblin(node);
return ReconnectNode(node);
}
//复制链表到后面
private static void cloneNode(LinkNode header){
if(header==null){
return;
}
LinkNode temp=header;
while(temp!=null){
LinkNode cloneNode=new LinkNode();
cloneNode.data=temp.data;
cloneNode.next=temp.next;
cloneNode.subLing=null;
cloneNode.next=temp.next;
temp.next=cloneNode;
temp=cloneNode.next;
}
}
//设置节点sibling值
private static void setCloneNodeSiblin(LinkNode header){
if(header==null){
return;
}
LinkNode temp=header;
while(temp!=null){
LinkNode cloneNode=temp.next;
if(temp.subLing!=null){
cloneNode.subLing=temp.subLing.next;
}
temp=cloneNode.next;
}
}
//分个两个链表
private static LinkNode ReconnectNode(LinkNode head){
LinkNode cloneheader=null;
LinkNode temp=head;
LinkNode cloneNode=null;
if(temp!=null){
cloneheader=cloneNode=temp.next;
temp=cloneNode.next;
}
while(temp!=null){
cloneNode.next=temp.next;
cloneNode=cloneNode.next;
temp=cloneNode.next;
}
return cloneheader;
}