zoukankan      html  css  js  c++  java
  • 算法总结之 复制含有随机指针节点的链表

    一种特殊的链表节点类描述如下:

      public class Node{

         public int value;

        public Node next;

        public Node rand;

      

       public Node(int data){

          this.value = data

     }

    }

     rand指针是Node类中的新增的指针,这个指针可能指向链表中任意的一个节点,也可能指向null

    首先介绍普通解法:

      使用哈希表

     首先从左到右遍历链表,对每个节点都复制生成相应的副本节点

    key 1  value 1`

    package TT;
    
    import java.util.HashMap;
    
    
    
    public class Test95 {
    
        public class Node{
            public int value;
            public Node next;
            public Node rand;
    
            public Node(int data){
                this.value=data;
            }
            
        }
        
        
        
        
        public Node copyListWithRand1(Node head){
            
            HashMap<Node, Node> map=new HashMap<Node, Node>();
            Node cur=head;
            while(cur != null){
                map.put(cur, new Node(cur.value));
                cur=cur.next;
            }
            cur=head;
            while(cur!=null){
                map.get(cur).next=map.get(cur.next);
                map.get(cur).rand=map.get(cur.rand);
                cur=cur.next;
            }
            return map.get(head);
        }
        
        
    }

     介绍进阶做法:

     不适用哈希表来保存对应关系,只用有限的几个变量完成所有的功能。

     1、首先从左到右遍历链表,对每个节点cur都复制生成相应的副本节点copy,然后把copy放在cur放在cur和下一个要遍历节点的中间

     2、再从左到右遍历链表,在遍历时设置每一个副本节点的rand指针

         这样: 每个节点的副本节点都在自己的后一个,所以此时通过next就可以找到 以这种方式可以设置每一个副本节点的rand指针

                    然后将其分离

    package TT;
    
    
    
    public class Test96 {
    
        public class Node{
            public int value;
            public Node next;
            public Node rand;
    
            public Node(int data){
                this.value=data;
            }
            
        }
        
        
        public Node copyListWidthRand2(Node head){
             
              if(head==null){
                  return null;
              }
              Node cur= head;
              Node next=null;
              
              while(cur!=null){
                  next=cur.next;
                  cur.next=new Node(cur.value);
                  cur.next.next=next;
                  cur=next;
              }
              
              cur=head;
              Node curCopy = null;
              while(cur!=null){
                  next=cur.next.next;
                  curCopy=cur.next;
                  curCopy.rand=cur.rand != null?cur.rand.next:null;
                  cur=next;
              }
              
              
              Node res = head.next;
              cur=head;
              
              while(cur!=null){
                  
                  next=cur.next.next;
                  curCopy=cur.next;
                  cur.next=next;
                  curCopy.next =next !=null?next.next:null;
                  cur=next;
                  
              }      
              return res;    
        }
    }
  • 相关阅读:
    linux基础学习-13.1-定时任务的介绍及分类
    linux基础学习-12.7-特殊权限-suid-粘滞位
    linux基础学习-12.6-linux系统默认权限控制命令umask
    linux基础学习-12.5-网站权限-通过控制权限让网站安全
    linux基础学习-12.4-对于目录来说r w x 是什么含义?
    linux基础学习-12.3-对于文件来说r w x 是什么含义?
    JavaWeb中文乱码解决方式
    c3p0-config.xml文件(连接数据库时可用)(重要)
    Jquery---定时器(实现页面内定时弹出广告,定时退出)
    Jquery----实现抽奖效果(根据姓名抽奖)
  • 原文地址:https://www.cnblogs.com/toov5/p/7500949.html
Copyright © 2011-2022 走看看