题目描述:
现在有一个这样的链表:链表的每一个节点都附加了一个随机指针,随机指针可能指向链表中的任意一个节点或者指向空。请对这个链表进行深拷贝。
题目分析:
在复杂链表中通常除了有指向下一个节点的指针域还有指向任意节点的指针域。一般复杂链表的过程分为三步走:
原始链表如下:
1.复制原始链表的任意节点N并创建新节点N‘,再将N’链到N后(例如图中所示)
2.复制出来的链SNode,原链表中节点N的任意指针指向SNode上的节点S,则N‘节点的任意指针指向S’节点
3.将长链表分为两个链表,奇数位置上为原始链表,偶数位置为赋值的链表
参考牛客网大牛的算法基础视频课程的复杂链表分析。
代码实现:
public class Solution {
public RandomListNode copyRandomList(RandomListNode head) {
if(head==null){
return null;
}
//当前节点指向复杂链表的头结点
RandomListNode curnode=head;
//赋值原始链表,并将新赋值的链表与原始链表链在一起
while(curnode!=null){
RandomListNode auxnode=new RandomListNode(curnode.label);
auxnode.next=curnode.next;
curnode.next=auxnode;
curnode=curnode.next.next;
}
//任意节点的指向,当前节点N指向长链表中的S节点,则N‘节点指向S节点的下一个节点S’
curnode=head;
while(curnode!=null){
RandomListNode curnode2=curnode.next;
if(curnode.random==null){
curnode2.random=null;
}else{
curnode2.random=curnode.random.next;
}
curnode=curnode.next.next;
}
//拆分链表,奇数位置为原始链表,偶数位置为赋值的链表
curnode=head;
RandomListNode aux2node=new RandomListNode(0);
RandomListNode newnode=aux2node;
while(curnode!=null){
RandomListNode tmp=curnode.next;
curnode.next=tmp.next;
aux2node.next=tmp;
curnode=curnode.next;
aux2node=aux2node.next;
}
return newnode.next;
}
}