链表是数据结构中最基础的内容,链表在存储结构上分成两种:数组形式储存,链式存储。
相比c语言需要的结构体,在java中由于有了面向对象编程,将指针‘藏’了起来,不需要分配内存。
所以只需要创建一个对象数组,为了能让链表更加实用,方便存储非基本类型的对象,所以使用了泛型。
菱形运算符<>中放你自己写的或者基本类型,比如你创建了一个Stdent类,想用链表将很多学生的信息存起来。
就可以myArrayList<Student> a=new myArrayList();这个链表就都存Student类的对象了。
数组链表的源码:
1 import java.util.Arrays; 2 3 /** 4 * @author 李正阳 5 * @param <E> 泛型:所存储的对象 6 */ 7 public class myArrayList<E> implements List<E> { 8 /** 9 * DEFAULT_SIZE 数组链表储存的最大值 10 * elementData 存储元素的数组 11 * capacity当前数组链表可以存储的个数(为了扩容存在) 12 * size当前链表存储的个数 13 */ 14 private final int DEFAULT_SIZE = 16; 15 private Object[] elementData; 16 private int capacity; 17 public int size; 18 19 /** 20 * 初始化数组栈 21 */ 22 public myArrayList() { 23 elementData = new Object[DEFAULT_SIZE]; 24 size = 0; 25 capacity=DEFAULT_SIZE; 26 } 27 28 /** 29 * 在数组链表的最后添加元素 30 * @param data 添加的元素 31 * @return true 添加成功 false 添加失败 32 */ 33 @Override 34 public boolean add(E data) { 35 if(isFull()) { 36 relloc(); 37 elementData[size] = data; 38 size++; 39 }else { 40 elementData[size] = data; 41 size++; 42 } 43 return true; 44 } 45 46 /** 47 * 判满函数 48 * @return true 满 false 未满 49 */ 50 @Override 51 public boolean isFull() { 52 if (size == DEFAULT_SIZE-1) { 53 return true; 54 } else { 55 return false; 56 } 57 } 58 /** 59 * 判空函数 60 * @return true 空 false 未空 61 */ 62 @Override 63 public boolean isEmpty() { 64 if (size ==0) { 65 return true; 66 } else { 67 return false; 68 } 69 } 70 71 /** 72 * 删除元素 73 * @param number 删除元素在数组中的位置 74 * @return 75 */ 76 @Override 77 public E remove(int number){ 78 79 E temp; 80 if (number == size) { 81 temp = (E) elementData[size - 1]; 82 size--; 83 } else if(number<size) { 84 temp = (E) elementData[number - 1]; 85 for (int i = number; i < size; i++) { 86 elementData[i] = elementData[i + 1]; 87 } 88 size--; 89 }else { 90 throw new ArrayIndexOutOfBoundsException(); 91 } 92 return temp; 93 94 } 95 96 /** 97 * 删除数组最后的元素 98 * @return 删除那个元素 99 */ 100 @Override 101 public E remove(){ 102 E temp; 103 temp = (E) elementData[size-1]; 104 size--; 105 return temp; 106 } 107 108 /** 109 * 设置某一个位置元素 110 * @param i 在数组的位置 111 * @param data 替换的元素 112 */ 113 @Override 114 public void set(int i,E data){ 115 if(i<=size) { 116 elementData[i - 1] = data; 117 }else { 118 throw new ArrayIndexOutOfBoundsException(); 119 } 120 } 121 122 /** 123 * 取得数组中某个位置的元素 124 * @param i 数组的位置 125 * @return 这个位置的对象 126 */ 127 @Override 128 public E get(int i){ 129 E temp; 130 if(i<=size) { 131 temp = (E) elementData[i - 1]; 132 return temp; 133 }else { 134 throw new ArrayIndexOutOfBoundsException(); 135 } 136 } 137 138 /** 139 * 判断一条链表是否为回文 140 * @return false 否 true 是 141 */ 142 @Override 143 public boolean isPalindrome() { 144 if(!isEmpty()) { 145 for (int i = 0, j = size - 1; i < size - 1; i++, j--) { 146 if (String.valueOf(elementData[i]).equals(String.valueOf(elementData[j]))) { 147 } else { 148 return false; 149 } 150 } 151 return true; 152 }else { 153 throw new NullPointerException(); 154 } 155 } 156 157 /** 158 * 输出链表中所有元素 159 */ 160 @Override 161 public void traver() { 162 for (int i=0;i<size;i++){ 163 System.out.print(elementData[i]+" "); 164 } 165 } 166 167 /** 168 * 扩容将数组扩容为两倍 169 */ 170 private void relloc(){ 171 capacity=DEFAULT_SIZE*2; 172 elementData=Arrays.copyOf(elementData,DEFAULT_SIZE*2); 173 } 174 }
List接口:
1 /** 2 * @author 李正阳 3 * @param <E> 泛型 4 */ 5 public interface List<E> { 6 public boolean add(E data) ; 7 8 /** 9 * 链式不需要这个方法 10 */ 11 default boolean isFull() { 12 return false; 13 } 14 public boolean isEmpty() ; 15 public E remove(int number); 16 public E remove(); 17 public void set(int i,E data); 18 public E get(int i); 19 public boolean isPalindrome(); 20 public void traver(); 21 }
原文地址:https://www.cnblogs.com/lzy321/p/10363697.html
时间: 2024-10-02 21:26:41