zoukankan      html  css  js  c++  java
  • 算法之 线性表链式结构

    代码逻辑很多地方可以重用,没有封装。

    链表主要是,根据前一项找后一项。

    代码:

    package math;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.Random;
    import java.util.UUID;
    
    /**
     * @author bin
     *
     * @param 链表 主要是必须前项包含后继得内存位置,只有根据前一项才能找到后一项。
     */
    public class SingleLinkList<E> {
        public List l;
        public int currentLen;//当前长度
        public Map m;
        public String address;//
        
        class Obj{
            private String address;
            private Object obj;
            
            public Obj(String str,Object o){
                this.address = str;
                this.obj = o;
            }
            public Obj(){
                
            }
        }
        
        public SingleLinkList(){
            this.currentLen = 0;
            //初始化,内存地址
            this.address = this.getUUid();
            //初始化map
            m = new HashMap();
        }
        
        // 增删改查  整表删除  是否为空   随机表创建 
        public void creatList(int i){
            this.check(i);
            Random r = new Random();
            String tempStr = new String();
            String uuid = new String();
            int rint;
            for (int j = 0; j < i; j++) {
                rint =  r.nextInt(40);
                System.out.println(rint);
                uuid  = this.getUUid();
                Obj o = new Obj(uuid, rint);
                if(j == 0){
                    //当前的记录
                    m.put(address, o);
                }else{
                    m.put(tempStr, o);
                }
                tempStr = uuid;
                currentLen = currentLen+1;
            }
        } 
        //取数据
        public Object getEle(int i){
            this.check(i);
            int start = 0;
            Obj o = new Obj();
            if(currentLen < 1 ){
                throw new RuntimeException("不合理得参数");
            }else if(i > currentLen){
                throw new RuntimeException("越界错误");
            }else{
                while (start <= i-1) {
                    if(start == 0){
                        o = (SingleLinkList<E>.Obj) m.get(address);
                    }else{
                        //System.out.println(m.get(o.address).toString());
                        o = (SingleLinkList<E>.Obj) m.get(o.address);
                    }
                    start++;                                                                     
                }
                return o.obj;
            }
        }
        public void delEle(int i){
            this.check(i);
            int start = 0;
            Obj opre = new Obj();
            Obj onow = new Obj();
            Obj opreer = new Obj();
            if(currentLen < 1 ){
                throw new RuntimeException("不合理得参数");
            }else if(i > currentLen){
                throw new RuntimeException("越界错误");
            }else{
                    while(start <= i-1) {
                        if(start >= 2){
                            //上一项的上一项
                            if(start == 2){
                                opreer = (SingleLinkList<E>.Obj)m.get(address);
                            }else{
                                opreer = (SingleLinkList<E>.Obj)m.get(opreer.address);
                            }
                        }
                        if(start == 0){
                            onow = (SingleLinkList<E>.Obj) m.get(address);
                        }else{
                            opre = onow;
                            onow = (SingleLinkList<E>.Obj) m.get(opre.address);
                            
                        }                    
                        if(start == i-1){
                            if(currentLen == i && i!=1){
                                m.remove(opre.address);
                            }else if(currentLen == i && i==1){
                                m.remove(address);
                            }else{
                                if(start == 1){
                                    String addr = onow.address;
                                    m.remove(opre.address);
                                    opre.address = addr;
                                    m.put(address, opre);
                                }else if(start == 0){
                                    Obj o = new Obj();
                                    o = (SingleLinkList<E>.Obj) m.get(onow.address);
                                    m.remove(address);
                                    m.put(address, o);
                                }else{
                                    String addr = onow.address;
                                    m.remove(opre.address);
                                    opre.address = addr;
                                    m.put(opreer.address, opre);
                                }
                            }
                            this.currentLen = currentLen-1;     
                        }                    
                        start++;
                    }
            }
        }
        public void insert(int i,Object object){
            this.check(i);
            int start = 0;
            Obj opre = new Obj();
            Obj onow = new Obj();
            Obj opreer = new Obj();
            Random r = new Random();
            String uuid ="";
            int rint = 0;
            if(currentLen < 1 ){
                throw new RuntimeException("不合理得参数");
            }else if(i > currentLen+1){
                throw new RuntimeException("越界错误");
            }else{
                    while(start <= i-1) {
                        if(start >= 2){
                            //上一项的上一项
                            if(start == 2){
                                opreer = (SingleLinkList<E>.Obj)m.get(address);
                            }else{
                                opreer = (SingleLinkList<E>.Obj)m.get(opreer.address);
                            }
                        }
                        if(start == 0){
                            onow = (SingleLinkList<E>.Obj) m.get(address);
                        }else{
                            opre = onow;
                            onow = (SingleLinkList<E>.Obj) m.get(opre.address);
                            
                        }                    
                        if(start == i-1){
                            if(currentLen == i && i!=1){
                                m.put(onow.address, object);
                            }else if(currentLen == i && i==1){
                                m.put(address, object);
                            }else{
                                rint =  r.nextInt(40);
                                uuid  = this.getUUid();
                                if(start == 1){
                                    String addr = opre.address;
                                    Obj o = new Obj(addr, object);
                                    m.put(uuid, o);
                                    opre.address = uuid;
                                    m.put(address, opre);
                                }else if(start == 0){
                                    Obj o = new Obj(uuid, object);
                                    m.put(uuid, onow);
                                    m.put(address, o);
                                
                                }else{
                                    String addr = opre.address;
                                    Obj o = new Obj(addr, object);
                                    m.put(uuid, o);
                                    opre.address = uuid;
                                    m.put(opreer.address, opre);
                                }
                            }
                            this.currentLen = currentLen+1;     
                        }                    
                        start++;
                    }
            }
        }
        
        public void update(int i,Object o){
            this.check(i);
            if(i > currentLen){
                throw new RuntimeException("越界错误");
            }
            Obj opre = new Obj();
            Obj onow = new Obj();
            int start = 0;
            while(start <= i-1){
                if(start == 0){
                    onow = (SingleLinkList<E>.Obj) m.get(address);
                }else{
                    opre = onow;
                    onow = (SingleLinkList<E>.Obj) m.get(opre.address);
                }
                
                if(start == i-1){
                    onow.obj = o;
                    m.put(opre.address, onow);
                }
                start++;
            }
        }
        
        public void check(int i){
            if(i<=0){
                throw new RuntimeException("不合法得参数");
            } 
        }
        public static void main(String[] args) {
            SingleLinkList sing = new SingleLinkList();
            sing.creatList(5);
            sing.delEle(3);
            sing.insert(3, 12);
            System.out.println(sing.currentLen+"--");
            for (int i = 1; i <=sing.currentLen; i++) {
                System.out.println(sing.getEle(i));
            }
        }
        //生成唯一得地址信息
        public String getUUid(){
            UUID uuid = UUID.randomUUID();
            return uuid.toString();
        }
    }
    积累知识,分享知识,学习知识。
  • 相关阅读:
    516. Longest Palindromic Subsequence
    31. Next Permutation
    572. Subtree of Another Tree
    vue中无法监听到子组件的事件的问题
    vue中注意watch的执行顺序
    vue中路由懒加载浅析
    关于typescript 报错问题
    深入理解Typescript中文版
    vue中的高阶组件
    vue中的mixins
  • 原文地址:https://www.cnblogs.com/bin-pureLife/p/4182164.html
Copyright © 2011-2022 走看看