线性表是最基本的一种数据结构,它是表示一组相同类型数据的有限序列,你可以把它与数组进行参考,但是它并不是数组,线性表是一种表结构,它能够支持数据的插入、删除、更新、查询等,同时数组可以随意存放在数组中任意位置,而线性表只能依次有序排列,不能出现空隙,因此,我们需要进一步的设计。

顺序表

将数据依次存储在连续的整块物理空间中,这种存储结构称为顺序存储结构,而以这种方式实现的线性表,我们称为顺序表。
同样的,表中的每一个个体都被称为元素,元素左边的元素(上一个元素),称为前驱,同理,右边的元素(后一个元素)称为后驱。
4-1 线性表 - 图1
我们设计线性表的目标就是为了去更好地管理我们的数据,也就是说,我们可以基于数组,来进行封装,实现增删改查!既然要存储一组数据,那么很容易联想到我们之前学过的数组,数组就能够容纳一组同类型的数据。
目标:以数组为底层,编写以下抽象类的具体实现

  1. /**
  2. * 线性表抽象类
  3. * @param <E> 存储的元素(Element)类型
  4. */
  5. public abstract class AbstractList<E> {
  6. /**
  7. * 获取表的长度
  8. * @return 顺序表的长度
  9. */
  10. public abstract int size();
  11. /**
  12. * 添加一个元素
  13. * @param e 元素
  14. * @param index 要添加的位置(索引)
  15. */
  16. public abstract void add(E e, int index);
  17. /**
  18. * 移除指定位置的元素
  19. * @param index 位置
  20. * @return 移除的元素
  21. */
  22. public abstract E remove(int index);
  23. /**
  24. * 获取指定位置的元素
  25. * @param index 位置
  26. * @return 元素
  27. */
  28. public abstract E get(int index);
  29. }

实现如下:

  1. public abstract class LinearList<E> {
  2. public abstract int getSize();
  3. public abstract void add(E e, int index);
  4. public abstract E remove(int index)throws Exception;
  5. public abstract E get(int index) throws Exception ;
  6. protected E[] e;
  7. protected int max;
  8. }
  9. class MyList extends LinearList<Integer>{
  10. public MyList(){
  11. max = 0;
  12. }
  13. public int getSize(){
  14. return max;
  15. }
  16. @Override
  17. public void add(Integer integer, int index) {
  18. Integer[] newArr = new Integer[max + 1];
  19. if(e == null) {
  20. newArr[index - 1] = integer;
  21. this.e = newArr;
  22. }
  23. for(i = 0;i < e.length;i++){
  24. newArr[i] = e[i];
  25. }
  26. newArr[index] = integer;
  27. }
  28. public Integer remove(int index) throws Exception{
  29. if(index > max || index < 0) throw new Exception("Out of Bound");
  30. Integer ret = e[index];
  31. for(int i = index - 1;i < e.length - 1; i++){
  32. if(i < max) e[i] = e[i+1];
  33. }
  34. max--;
  35. return ret;
  36. }
  37. public Integer get(int index) throws Exception {
  38. if(index > max || index < 0) throw new Exception("Out of Bound");
  39. return e[index];
  40. }
  41. }