动态顺序表及其接口(Java实现)

顺序表使用一段物理地址连续的存储单元依次存储数据元素的线性结构 一般情况下采用数组存储 在数组上完成数据的赠三改查

顺序表一般可以分为:

静态顺序表,使用定长数组存储

动态顺序表,使用动态开辟的数组存储

 

顺序表就是我们熟悉的数组 擅长随机访问 给定位置 能够高效的获取、修改指定位置的值

时间复杂度是O(1)

顺序表按值查找 插入 删除 时间复杂度是O (N)

对于尾插和尾删 时间复杂度是O(1)

public class Test {
    public static void main(String[] args) {
        TestAdd();
        TestContains();
        TestSearch();
        TestRemove();
    }

    public static void TestAdd() {
        System.out.println("测试add");
        SeqList seqlist = new SeqList();

        seqlist.add(0,1);
        seqlist.add(1,2);
        seqlist.add(2,3);
        seqlist.add(3,4);
        seqlist.add(2,5);

        seqlist.display();
    }

    public static void TestContains() {
        System.out.println("测试contains");
        SeqList seqlist = new SeqList();

        seqlist.add(0,1);
        seqlist.add(1,2);
        seqlist.add(2,3);
        seqlist.add(3,4);
        seqlist.add(2,5);

        boolean result = seqlist.contains(5);
        System.out.println("result 预期是 true 实际是 " + result);
    }

    public static void TestSearch() {
        System.out.println("测试search");
        SeqList seqlist = new SeqList();

        seqlist.add(0,1);
        seqlist.add(1,2);
        seqlist.add(2,3);
        seqlist.add(3,4);
        seqlist.add(2,5);

        int result = seqlist.search(5);
        System.out.println("result 预期是 2 实际是 " + result);
    }

    public static void TestRemove() {

        System.out.println("测试remove");
        SeqList seqlist = new SeqList();

        seqlist.add(0,1);
        seqlist.add(1,2);
        seqlist.add(2,3);
        seqlist.add(3,4);
        seqlist.add(2,5);
        seqlist.remove(3);
        System.out.println("预期值是:[1,2,5,4]");
        System.out.print("实际值是:");
        seqlist.display();
    }
}
public class SeqList {
    private int[] data = new int[10];
    private int size = 0;

    //打印
    public void display() {
        //System.out.println(Arrays.toString(data));
        System.out.print("[");
        for (int i = 0;i < size;i++) {
            System.out.print(data[i]);
            if (i != size - 1) {
                System.out.print(",");
            }
        }
        System.out.println("]");
    }

    //插入 时间复杂度是O(n)
    public void add(int pos,int elem) {
        if(pos < 0 || pos > size) {
            //位置无效
            return;
        }
        if (this.size >= this.data.length) {
            realloc();
        }
        if(pos == size) {
            //尾插的情况 直接把新元素放到size下标的位置
            this.data[pos] = elem;
            this.size++;
            return;
        }
        //处理插入在中间位置的情况 进行搬运 把后面的元素依次后移
        for (int i = this.size;i > pos;i--) {
            this.data[i] = this.data[i - 1];
        }
        this.data[pos] = elem;
        this.size++;
    }

    private void realloc() {
        //扩容的策略很灵活 根据实际问题场景的特点来决定具体是
        //线性增长还是指数增长 或者其他方式
        //原则是扩容是比较大的开销
        int[] newData = new int[this.data.length * 2];
        for (int i = 0;i < this.data.length;i++) {
            newData[i] = this.data[i];
        }
        this.data = newData;
    }

    //判断是否存在某个元素
    public boolean contains(int toFind) {
        for (int i = 0;i < this.size;i++) {
            if(this.data[i] == toFind) {
                return true;
            }
        }
        return false;
    }

    //查找
    public int search(int toFind) {
        for(int i = 0;i < this.size;i++) {
            if (this.data[i] == toFind) {
                return i;
            }
        }
        return -1;
    }

    //获取某个位置的元素
    public int getPos(int pos) {
        return this.data[pos];
    }

    //重置某个位置的元素
    public void setPos(int pos,int elem) {
        this.data[pos] = elem;
    }

    //删除第一次出现的元素key
    public void remove(int toRemove) {
        int pos = search(toRemove);
        if(pos == -1) {
            //不存在
            return;
        }
        if(pos == this.size - 1) {
            //如果是最后一个元素 直接size-- 即可
            //size 描述了有效元素的个数
            this.size--;
            return;
        }
        //如果删除的是中间位置 需要搬运
        for (int i = pos;i < size - 1;i++) {
            this.data[i] = this.data[i + 1];
        }
        this.size--;
    }

    //获取长度
    public int size() {
        return this.size;
    }

    //清空
    public void clear() {
        this.size = 0;
        this.data = new int[10];
    }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章