题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
思路:先赋值原来的链表,不管random,然后把复制到的链表插入元链表,比如A-B复制了a-b,就插入成A-a-B-b;那么A.random指向B的话,a.random就指向A.random.next;把random设置完;再拆开链表;偶数的为复制出来的链表;
package 剑指offer;
public class 复杂链表的复制 {
static class RandomListNode {
int label;
RandomListNode next = null;
RandomListNode random = null;
RandomListNode(int label) {
this.label = label;
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
RandomListNode pHead1 = new RandomListNode(1);
RandomListNode pHead2 = new RandomListNode(2);
RandomListNode pHead3= new RandomListNode(3);
RandomListNode pHead4 = new RandomListNode(4);
RandomListNode pHead5 = new RandomListNode(5);
pHead1.next = pHead2;
pHead2.next = pHead3;
pHead3.next = pHead4;
pHead4.next = pHead5;
pHead1.random = pHead3;
pHead2.random = pHead5;
pHead3.random = null;
pHead4.random = pHead2;
pHead5.random = null;
RandomListNode copy = Clone(pHead1);
while (copy!=null) {
System.out.print(copy.label+" ");
if (copy.random!=null) {
System.out.println(copy.random.label);
}else {
System.out.println();
}
copy = copy.next;
}
}
public static RandomListNode Clone(RandomListNode pHead)
{
RandomListNode copynode = clonecopynode(pHead);//得到复制后的链表;
RandomListNode twoonnect = connectwo(pHead,copynode);
RandomListNode answernode = departwo(twoonnect);
return answernode;
}
/*拆开链表,偶数的为复制的链表*/
private static RandomListNode departwo(RandomListNode twoonnect) {
// TODO Auto-generated method stub
RandomListNode ansnode = twoonnect.next;
RandomListNode head = twoonnect.next;
RandomListNode temp = null;
while (head.next!=null) {
temp = head.next.next;
head.next = head.next.next;
head = temp;
}
return ansnode;
}
/*把复制的链表插入原链表,计算random*/
private static RandomListNode connectwo(RandomListNode pHead, RandomListNode copynode) {
// TODO Auto-generated method stub
RandomListNode head = pHead;//记录头结点
RandomListNode temp1 = null;
RandomListNode temp2 = null;
while (pHead!=null) {
temp1 = pHead.next;
pHead.next = copynode;
temp2 = copynode.next;
copynode.next = temp1;
pHead = temp1;
copynode = temp2;
}
pHead = head;
while (pHead!=null) {
temp1 = pHead.next.next;
if (pHead.random!=null) {
pHead.next.random = pHead.random.next;
}else {
pHead.next.random = null;
}
pHead = temp1;
}
return head;
}
/*
* 复制出一个带next的链表
* */
private static RandomListNode clonecopynode(RandomListNode pHead) {
// TODO Auto-generated method stub
if (pHead==null) {
return null;
}
RandomListNode realhead = pHead;
RandomListNode copynode = new RandomListNode(pHead.label);
pHead = pHead.next;
int flag = 1;
RandomListNode prenode = copynode;
while (pHead!=null) {
RandomListNode copynextnode = new RandomListNode(pHead.label);
if (flag==1) {
copynode.next = copynextnode;
flag++;
}else {
prenode.next = copynextnode;
}
prenode = copynextnode;
pHead = pHead.next;
}
return copynode;
}
}