请实现函数,复制一个复杂链表。在复杂链表中,每个结点除了有一个next 域指向下一个结点外,还有一个sibling 指向链表中的任意结点或者null。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40301026/article/details/88979617

题目:请实现函数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);
	}
}

 

猜你喜欢

转载自blog.csdn.net/qq_40301026/article/details/88979617
今日推荐