思路参考牛客大佬题解
注意:注意复制链表的最后一个结点的next指针不能跟原链表指向同一个空结点None,next指针要重新赋值None(判定程序会认定你没有完成复制)
代码:
public RandomListNode Clone(RandomListNode pHead) {
if (pHead==null){
return null;
}
//1.复制每个结点到原结点之后
RandomListNode currNode=pHead;
while (currNode!=null){
RandomListNode currNodeClon=new RandomListNode(currNode.label);
RandomListNode nextNode=currNode.next;
currNode.next=currNodeClon;
currNodeClon.next=nextNode;
currNode =nextNode;
}
//赋值后的结点树是偶数个
//重新遍历链表将老结点的随机结点的拷贝份 赋值给克隆结点随机结点
currNode=pHead;
while (currNode!=null){
currNode.next.random=currNode.random.next;
currNode=currNode.next.next;
}
//拆分链表,拆除新旧链表
RandomListNode cloneHead=pHead.next;
currNode=pHead;
while (currNode!=null){
RandomListNode cloneNode=currNode.next;
currNode.next=cloneNode.next;
cloneNode.next=cloneNode.next==null?null:cloneNode.next.next;
currNode=currNode.next;
}
return cloneHead;
}`