开始正式了解结构...一、顺序表的理解顺序表是一种线性表它用一段地址连续的存储单元依次存储线性表的数据元素比喻电影院座位把顺序表想象成电影院里一排连续的座位连续存储这些座位是紧挨着的一个接一个拥有固定的座位号如1排1座、1排2座...。这就是“顺序”的含义——数据在物理内存中是连续存储的快速“按号找座”如果你想找第5个座位上坐的是谁你可以立刻计算出来并直接走过去“插队”与“离场”麻烦插入如果这排座位已经坐满了你想在中间加一个人那么从这个位置开始以后的所有人都需要向后移动一个位置才能空出一个新的座位删除同理如果中间有一个人离开了那么他后面的所有人都需要向前移动一个位置来填补空位以保持座位的连续性总结注意指定位置插入的add与remove方法1、一个自己实现的顺序表package structure; public interface IList { //新增元素,默认在数组最后插入 void add(int data); //在 pos 位置插入新增元素 void add(int pos, int data); //判定是否包含某个元素 boolean contains(int toFind); //查找某个元素对应的位置 int indexOf(int toFind); //获取 pos 位置的元素 int get(int pos); //给 pos 位置的元素设为 value void set(int pos, int value); //删除第一次出现的关键字key void remove(int toRemove); //获取顺序表长度 int size(); //清空顺序表 void clear(); //打印顺序表,该方法并不是顺序表中的方法,是方便看测试结果给出的 void display(); //空的还是满的 boolean isFull(); boolean isEmpty(); }package structure; import loose.ListEmptyException; import java.lang.management.MemoryManagerMXBean; import java.util.ArrayList; import java.util.Arrays; import java.util.EmptyStackException; public class MarryList implements IList { private int[] array; //私有的只在类内部调用 //静态的所有创建的对象共享不用反复创建占用内存 //常量的规定常量不变命名采用“全大写下划线” //代表默认数组容量 private static final int DEFAULT_CAPACITY 5; //数组元素个数 private int count 0; public MarryList(){ array new int[DEFAULT_CAPACITY]; } //自己实现的方法并进行了封装不希望外部调用 //数组扩容 private void grow(){ if(isFull()){ array Arrays.copyOf(array,array.length*2); } } //检查pos位置合法性 private void checkPos(int pos){ if(pos 0 || pos count){ throw new OutBoundException(pos位置不合法: pos pos); } } Override public void add(int data) { grow(); array[count] data; // array[count] data; // count; } //在指定pos位置插入元素 Override public void add(int pos, int data) { grow(); checkPos(pos); //从最后一个元素位置开始数据依次前移 //直到插入位置pos(包括pos)时停止 for (int i count-1; i pos; i--) { array[i1] array[i]; } array[pos] data; //最后别忘了更新元素个数 count; } Override public boolean contains(int toFind) { for (int i 0; i count; i) { if(array[i] toFind){ return true; } } return false; } Override public int indexOf(int toFind) { for (int i 0; i count; i) { if (array[i] toFind){ return i; } } return -1; } Override public int get(int pos) { //先验证数组是不是空的再检查位置合法性 if (isEmpty()) { throw new ListEmptyException(数组是空的); } checkPos(pos); return array[pos]; } Override public void set(int pos, int value) { checkPos(pos); array[pos] value; } Override public void remove(int toRemove) { int s indexOf(toRemove); if (s -1){ System.out.println(没有要删除的元素); //别忘了return防止继续往下执行 return; } //注意这里跟add的区别 for (int i s; i count - 1 ; i) { array[i] array[i1]; } //别忘了最后减一个元素 count--; } Override public int size() { return count; } Override public void clear() { //让如果是引用类型需要一个个遍历并给它们设置成null // for (int i 0; i count; i) { // array[i] null; // } count 0; } Override public void display() { for (int i 0; i count; i) { System.out.print(array[i] ); } System.out.println(); } Override public boolean isFull() { return array.length count; } Override public boolean isEmpty() { return count 0; } //endregion public static void main(String[] args) { MarryList m new MarryList(); m.add(1); m.add(2); m.add(3); m.add(4); m.add(5); m.add(99); m.display(); } }package structure; public class OutBoundException extends RuntimeException{ public OutBoundException(String message) { super(message); } }自己实现过后有助于更好的理解顺序表有助于后面使用ArrayList2、对于add与remove移动方向的着重分析add的在指定位置pos增添元素如图所示array[i1] array[i];remove删除元素如图所示array[i] array[i1];稍微注意一下这两个方法的区别即可二、两个ArrayList具体实现的题目118. 杨辉三角 - 力扣LeetCodeimport java.util.ArrayList; import java.util.List; //杨辉三角 public class java0823 { public static ListListInteger generate(int numRows){ List Integer list new ArrayList(); list.add(1); //设置顺序表第一行默认是个1 List ListInteger blank new ArrayList(); blank.add(list); for (int i 1; i numRows; i) { List Integer thisRow new ArrayList(); //每生成一行的更新 List Integer preRow blank.get(i-1); //表示上一行 thisRow.add(1); //一行的第一个元素默认是个1 for (int j 1; j i; j) { //[i][j] [i-1][j] [i-1][j-1]; int a preRow.get(j) preRow.get(j-1); thisRow.add(a); } //中间行的元素自己根据规律添加 thisRow.add(1); //一行的最后一个元素也默认是1 blank.add(thisRow); } return blank; } public static void main(String[] args) { System.out.println(generate(4)); System.out.println(generate(5)); } }