题目:请实现函数ComplexListNode clone(ComplexListNode head),复制一个复杂链表。在复杂链表中,每个结点除了有一个next 域指向下一个结点外,还有一个sibling 指向链表中的任意结点或者null。
package cn.liu.test;
/**
* 链表结点
* @author Administrator
*
*/
public class LinkedNode {
private Object data;
private LinkedNode next;
private LinkedNode sibing;
public LinkedNode(Object data) {
super();
this.data = data;
}
public LinkedNode(Object data, LinkedNode next, LinkedNode sibing) {
super();
this.data = data;
this.next = next;
this.sibing = sibing;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public LinkedNode getNext() {
return next;
}
public void setNext(LinkedNode next) {
this.next = next;
}
public LinkedNode getSibing() {
return sibing;
}
public void setSibing(LinkedNode sibing) {
this.sibing = sibing;
}
}
package cn.liu.test;
/**
* 复杂链表的复制
* @author Administrator
*
*/
public class Demo01 {
//复杂链表的复制
public LinkedNode clone(LinkedNode head) {
if(head==null) {return null;}
//复制链表
copyLink(head);
//拆分链表
return splitLink(head);
}
//复制链表
private void copyLink(LinkedNode head) {
LinkedNode temp = head;
//只复制结点,但不复制sibing指针
while(temp!=null) {
LinkedNode newNode = new LinkedNode(temp.getData()+"'");//新建一个结点
newNode.setNext(temp.getNext());//指向temp后面的结点
temp.setNext(newNode);//temp结点指向newNode
temp = newNode.getNext();//temp指向下一个未复制结点
}
LinkedNode p = head;//用来指向原结点
temp = p.getNext();//用来指向复制结点
//复制sibing指针
while(temp.getNext()!=null){
//如果原结点没有sibing指针为空,则不复制
if(p.getSibing()==null) {
p = temp.getNext();
temp = p.getNext();
continue;
}
temp.setSibing(p.getSibing().getNext());//temp结点的sibing指向被复制结点sibing指向结点的后面的结点
p = temp.getNext();
temp = p.getNext();
}
}
//拆分链表
private LinkedNode splitLink(LinkedNode head) {
LinkedNode p = head;//指向原结点
LinkedNode temp = p.getNext();//指向复制结点
LinkedNode copyhead = temp;//复制链表的头结点
copyhead = temp;
while(temp.getNext()!=null) {
p.setNext(temp.getNext());
temp.setNext(p.getNext().getNext());
p = p.getNext();
temp = temp.getNext();
}
return copyhead;
}
public void print(LinkedNode head) {
StringBuffer sb = new StringBuffer();
LinkedNode temp = head;
while(temp!=null) {
sb.append(temp.getData()+"(");
if(temp.getSibing()!=null) {
sb.append(temp.getSibing().getData()+")"+"---->");
}else{
sb.append("null"+")"+"---->");
}
temp = temp.getNext();
}
sb.delete(sb.length()-5, sb.length());
System.out.println(sb);
}
}
package cn.liu.test;
public class Test {
public static void main(String[] args) {
LinkedNode b = new LinkedNode('B');
LinkedNode e = new LinkedNode('E',null,null);
LinkedNode d = new LinkedNode('D',e,b);
LinkedNode c = new LinkedNode('C',d,null);
b.setNext(c);
b.setSibing(e);
LinkedNode a = new LinkedNode('A',b,c);
Demo01 ss = new Demo01();
ss.print(a);
LinkedNode head = ss.clone(a);
ss.print(head);
}
}