java 复杂链表的复制

题目

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)

解决思路

思路1:

先复制原始链表的结点

在元素链表的头结点开始找每个结点的random。每次都要从投开始找,然后连接起来,所以时间复杂度是o(n*n)

思路2:

用空间换时间。创建一个map映射表。(原始结点,复制的结点)。找到结点的random时间复杂度是o(1)。所以最后是o(n)。

思路3:


java 复杂链表的复制_第1张图片


代码

public class Main {

	public static class RandomListNode {
	    int label;
	    RandomListNode next = null;
	    RandomListNode random = null;

	    RandomListNode(int label) {
	        this.label = label;
	    }
	}
	
	
	public RandomListNode Clone(RandomListNode pHead)
    {
		if(pHead==null) return null;
		//复制原始链表并创建新节点N',把N'连接到N的后面
		RandomListNode pNode=pHead;
		while(pNode!=null){
			RandomListNode pClone=new RandomListNode(pNode.label);
			pClone.next=pNode.next;
			pClone.random=null;
			pNode.next=pClone;
			pNode=pClone.next;
		}
		
		//设置N'的random
		RandomListNode pNode2=pHead;
		while(pNode2!=null){
			if(pNode2.random!=null){
				pNode2.next.random=pNode2.random.next;
			}
			pNode2=pNode2.next.next;
		}
		//把长链表拆分成两个链表,奇数位置节点是原始链表,偶数位置的结点是复制后的链表
		RandomListNode pNode3=pHead;
		RandomListNode pCloneHead=null;
		RandomListNode pCloneNode=null;
		
		if(pNode3!=null){
			pCloneHead=pCloneNode=pNode3.next;
			pNode3.next=pCloneNode.next;
			pNode3=pNode3.next;
		}
		while(pNode3!=null){
			pCloneNode.next=pNode3.next;
			pCloneNode=pCloneNode.next;
			pNode3.next=pCloneNode.next;
			pNode3=pNode3.next;
		}
		
		return pCloneHead;
    }
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		RandomListNode head=new RandomListNode(1);
		RandomListNode b=new RandomListNode(2);
		RandomListNode c=new RandomListNode(3);
		RandomListNode d=new RandomListNode(4);
		RandomListNode e=new RandomListNode(5);
		head.next=b;
		head.random=c;
		b.next=c;
		b.random=e;
		c.next=d;
		c.random=null;
		d.next=e;
		d.random=b;
		e.next=null;
		e.random=null;
		Main m=new Main();
		RandomListNode temp=null;
		temp=m.Clone(head);
		while(temp!=null){
			System.out.println(temp.label);
			temp=temp.next;
		}
		
	}

}


你可能感兴趣的:(数据结构和算法)