题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
/*
public class RandomListNode {
int label;
RandomListNode next = null;
RandomListNode random = null;
RandomListNode(int label) {
this.label = label;
}
}
*/
public class Solution {
public RandomListNode Clone(RandomListNode pHead)
{
if(pHead == null)
return null;
RandomListNode res;
RandomListNode p = pHead;
while(p != null){
RandomListNode q = new RandomListNode(p.label);
q.next = p.next;
p.next = q;
p = q.next;
}
p = pHead;
while(p != null){
RandomListNode p2 = p.next;
if(p.random != null)
p2.random = p.random.next;
p = p2.next;
}
p = pHead;
res = p.next;
while(p != null){
RandomListNode p2 = p.next;
RandomListNode tmp = p2.next;
if(tmp == null){
p2.next = tmp;
}else{
p2.next = tmp.next;
}
p.next = tmp;
p = tmp;
}
return res;
}
}
(1)首先在每个结点后面添加一个结点
(2)对新添加的每个结点的random指针根据前面的指针的random进行复制!这里注意一定要判断if(p.random != null)
因为后面用到了p.random.next(),若这里不判断null的话,会出现空指针错误!
(3)在拆分数组的时候也得对最后的结点进行判断,因为最后会有一个null指针表示链表的结束,而新的复杂链表是没有null指针的,所以需要合理的添加一个!而且后面使用到了tmp.next
,这种指针的指针最好都要进行判断null!!!
参考:
https://blog.csdn.net/u012289407/article/details/46609731