题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
package xidian.lili.niuke;
public class CloneRandomListNode {
public RandomListNode Clone(RandomListNode pHead)
{
if(pHead==null){
return null;
}
RandomListNode newHead =pHead;
//挨个复制节点
while(newHead!=null){
RandomListNode clone =new RandomListNode(newHead.label);
clone.next=newHead.next;
newHead.next=clone;
newHead=clone.next;
}
//复制random
newHead=pHead;
while(newHead!=null){
if(newHead.random!=null){
newHead.next.random=newHead.random.next;
}
newHead=newHead.next.next;
}
//拆分列表
RandomListNode head=pHead.next;
RandomListNode cur=head;
newHead=pHead;
while(newHead!=null){
newHead.next=newHead.next.next;
if(cur.next!=null){
cur.next=cur.next.next;
}
cur=cur.next;
newHead=newHead.next;
}
return head;
}
}
class RandomListNode {
int label;
RandomListNode next = null;
RandomListNode random = null;
RandomListNode(int label) {
this.label = label;
}
}
(1)复制节点,每个节点的复制节点连接在当前节点的后面(A-A'-B-B'-C-C'-D-D')
(2)复制random节点,比如A节点的随机节点指向C,那么A'指向C'节点
newHead.next.random=newHead.random.next;
newHead.next.random=newHead.random是错误的,这样A'的随机节点指向了C,而不是C'
(3)拆分链表,分开原节点和复制节点