凯哥学堂

搜索

凯哥学堂

双链集合添加删除算法

2017-8-23 16:12| 发布者: 可可| 查看: 8| 评论: 0

凯哥学堂 首页 资讯 学习笔记 查看内容

双链集合添加删除算法:

package com.linkes;

public class MyLinkeList {
/**
 * 更多资料欢迎浏览凯哥学堂官网:http://kaige123.com
 * @author 小沫
 */
    /**
     * 链表集合他是于双链条式进行引用上下家,好处可以知道上家和下家是谁
     * 利于修改,可以从首部开始删除数据也可以从尾部删除。
     * 即可从中间指定位置删除。
     */
    private Object[] shou;
    private Object[] wei;

    // 默认添加方法
    public void add(Object obj) {
        if (shou == null) {
            //首部为空就new好空间第1个和第三个放null第二个放传递进来的数据
            shou = new Object[] { null, obj, null };
            wei = shou;//把尾部指向了首部
        } else {
            //如果首部有数据,那么就new好长度为3的空间
            //把wei放入第一个指向了上家,第二个放入当前的数据,第三个为NULL
            Object[] objs = new Object[] { wei, obj, null };
            wei[2] = objs;//尾部的第三个指向了objs
            wei = objs;//objs更新成尾部
        }
    }

    // 从最后面添加方法
    public void addlast(Object obj) {
        add(obj);
    }

    // 从最前面添加方法
    public void addFirst(Object obj) {
        if (shou == null) {
            shou = new Object[] { null, obj, null };
            wei = shou;
        } else {
            Object[] objs = new Object[] { null, obj, shou };
            shou[0] = objs;
            shou = objs;
        }
    }

    // 全部删除方法
    public void removeAll(int delAll) {
        if (delAll == 0) {
            wei = null;//直接制个空就全部删除了
            shou = null;
            System.out.println("清除完成");
        } else {
            try {
                throw new Exception("删除失败!delAll需为'0'");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    // 从最后面删除方法
    public Object removeLast() {
        Object obj = null;

        if (wei == null) {//没有尾部那么直接返回false
            return false;
        }
        //请问有没有上家
        if (wei[0] == null) {
            //如果没有直接把尾跟首制空  因为没有上家意味着只有一个数据
            wei = null;
            shou = null;
        } else {
            //有上家那就把尾部1里面的数据交给obj
            obj = wei[1];
            wei = (Object[]) wei[0];//尾部指向了尾部的下标0
            wei[2] = null;
        }
        return obj;
    }

    // 从最前面删除方法
    public Object removeFirst() {
        Object obj = null;
        obj = shou[1];
        if (shou == null) {
            return false;
        }
        if (shou[2] == null) {
            wei = null;
            shou = null;
        } else {
            shou = (Object[]) shou[2];
            shou[0] = null;
        }
        return obj;
    }

    // 从中间删除方法
    public boolean remove(Object obj) {
        Object[] objs = shou;
        while (true) {//找上下家
            //传进来的数据是不是等于了objs当前的数据
            if (obj.equals(objs[1])) {
                break;//如果等于了那就是找到了跳出循环
            }
            //如果传进来的数据不是当前数据那么就列出下家
            objs = (Object[]) objs[2];
            if (objs == null) {//如果没有下家了那么就跳出循环
                break;
            }
        }
        if (objs == null) {
            return false;
        }
        if (objs == shou) {//问是不是删除首部
            removeFirst();
        } else if (objs == wei) {//是不是删除尾部
            removeLast();
        } else {
            //把当前数据拆分成上家和下家
            Object[] shang = (Object[]) objs[0];
            Object[] xia = (Object[]) objs[2];
            shang[2] = xia;//把上家的下标2引用了下家数据
            xia[0] = shang;//把下家的下标0引用了上家数据
        }
        return true;
    }

    private Object[] dq = null;
    //用hashNext一个个询问数据检索
    public boolean hashNext() {
        if (dq == null) {
            dq = shou;
            if (dq == null) {
                return false;
            }
            return true;
        }
        dq = (Object[]) dq[2];
        if (dq == null) {
            return false;
        }
        return true;
    }
    //用Next进行拿到值
    public Object Next() {
        return dq[1];
    }
}

测试类:

ackage com.linkes;

public class Test {

    public static void main(String[] args) {

        MyLinkeList linke = new MyLinkeList();

        linke.add("a");
        linke.addlast("b");
        linke.addFirst("c");
        linke.addFirst("d");
        linke.addFirst("e");
        linke.addFirst("f");
        linke.addFirst("g");

        linke.removeAll(1);


        while(linke.hashNext()){
            System.out.println(linke.Next());
        }

    }

}



鲜花

握手

雷人

路过

鸡蛋

上一篇:网络编程

关注我们


微信

微博

QQ