牛客网刷题之复杂链表

题目描述:
现在有一个这样的链表:链表的每一个节点都附加了一个随机指针,随机指针可能指向链表中的任意一个节点或者指向空。请对这个链表进行深拷贝。
题目分析:
在复杂链表中通常除了有指向下一个节点的指针域还有指向任意节点的指针域。一般复杂链表的过程分为三步走:
原始链表如下:
在这里插入图片描述 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;
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值