描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
public class Jz25_Clone {
@Test
public void test() {
RandomListNode node1 = new RandomListNode(1);
RandomListNode node2 = new RandomListNode(2);
RandomListNode node3 = new RandomListNode(3);
RandomListNode node4 = new RandomListNode(4);
RandomListNode node5 = new RandomListNode(5);
node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
node1.random = node3;
node2.random = node5;
node4.random = node2;
RandomListNode cur = node1;
while (null != cur) {
System.out.println(" value:" + cur.label + ",random value:" + (null == cur.random ? "#" : cur.random.label));
cur = cur.next;
}
RandomListNode clone = Clone(node1);
cur = clone;
while (null != cur) {
System.out.println(" value:" + cur.label + ",random value:" + (null == cur.random ? "#" : cur.random.label));
cur = cur.next;
}
}
public RandomListNode Clone(RandomListNode pHead) {
if(null == pHead){
return null;
}
//复制下一个
RandomListNode cur = pHead;
while (null != cur) {
RandomListNode nNode = new RandomListNode(cur.label);
nNode.random = cur.random;
RandomListNode next = cur.next;
cur.next = nNode;
nNode.next = next;
cur = next;
}
//更改随即指针指向新的节点,完成随机指针的复制
//注意这个地方的判空
cur = pHead.next;
while (null != cur) {
if (null != cur.random) {
cur.random = cur.random.next;
}
if (null != cur.next) {
cur = cur.next.next;
} else {
cur = cur.next;
}
}
cur = pHead;
RandomListNode nHead = pHead.next;
RandomListNode ncur = pHead.next;
while (null != cur) {
cur.next = cur.next.next;
cur = cur.next;
if (null == cur) {
ncur.next = null;
} else {
ncur.next = cur.next;
ncur = ncur.next;
}
}
return nHead;
}
public class RandomListNode {
int label;
RandomListNode next = null;
RandomListNode random = null;
RandomListNode(int label) {
this.label = label;
}
}
}