复杂链表的复制

  • 思路比较简单,主要是利用两个ArrayList,一个用来存复杂链表的节点值,另一个用来存复杂链表的随机指针的index(也就是链表中的第几个节点)

  • 处理的时候我自己是先去把一个单向链表复制完,然后再循环一次去把链表的随机指针更正上去

  • 注意空指针的特殊情况就好啦

  • 直接上代码

    ArrayList<Integer> array = new ArrayList<>() ;
           RandomListNode node = pHead ;
    
           if (pHead!=null){ // 存节点的label值
               while (node!=null){
                   array.add(node.label);
                   node = node.next ;
               }
    
               node = pHead ;
               ArrayList<Integer> indexs = new ArrayList<>() ;
               while (node!=null){ //存随机指针的节点index,如果没有随机指针就为null
                   if (node.random!=null) {
                       indexs.add(array.indexOf(node.random.label));
                   }else if (node.random==null){
                       indexs.add(null) ;
                   }
                   node = node.next ;
               }
    
               RandomListNode head = new RandomListNode(array.get(0)) ;
               node = head ;
    
               for (int i=1;i<array.size();i++){ // 构建出单向链表
                   node.next = new RandomListNode(array.get(i)) ;
                   node = node.next ;
               }
    
               node = head ;
    
               for (int i=0;i<indexs.size();i++){ //给新构建的单向链表更正随机指针
                   if (indexs.get(i)!=null) {
    
                       RandomListNode temp = head ;
                       for (int j=0;j<indexs.get(i);j++){ //用于获取随机指针的地址
                           temp = temp.next ;
                       }
    
                       node.random = temp;
                   }
                   node = node.next ;
    
               }
    
               return head ;
           }else { //空指针就特殊处理掉
               return null ;
           }