LinkedList和ArrayList的设计
同时设计LinkedList和ArrayList
- LinkedList不需要构造函数
- ArrayList需要,后者需要一个容量的初始化。
接口List设计
只用来声明对外接口,不能声明
package com.wztlink1013.ds.linkedlist;/*** fun:实现ArrayList和LinkedList的接口**/public interface List<E> {static final int ELEMENT_NOT_FOUND = -1;/*** 元素的数量[抽象类中实现]* @return*/int size();/*** 是否为空[抽象类中实现]* @return*/boolean isEmpty();/*** 是否包含某个元素[抽象类中实现]* @param element* @return*/boolean contains(E element);/*** 添加元素到尾部[抽象类中实现]* @param element*/void add(E element);/*** 清除所有元素[实现类中实现]*/void clear();/*** 获取index位置的元素[实现类中实现]* @param index* @return*/E get(int index);/*** 设置index位置的元素[实现类中实现]* @param index* @param element* @return 原来的元素ֵ*/E set(int index, E element);/*** 在index位置插入一个元素[实现类中实现]* @param index* @param element*/void add(int index, E element);/*** 删除index位置的元素[实现类中实现]* @param index* @return*/E remove(int index);/*** 查看元素的索引[实现类中实现]* @param element* @return*/int indexOf(E element);}
抽象类AbstractList设计
放ArrayList和LinkedList的公共代码
- 实现List接口类的共同代码
- ArrayList和LinkedList都用得到但是不对外公开的代码
声明抽象类abstract,就意味着可以不用全部实现接口List里面的所有方法
package com.wztlink1013.ds.linkedlist;/*** fun:放ArrayList和LinkedList公共代码的抽象类(父类)**/public abstract class AbstractList<E> implements List<E> {protected int size;/*** 元素的数量* @return*/public int size() {return size;}/*** 是否为空* @return*/public boolean isEmpty() {return size == 0;}/*** 是否包含某个元素* @param element* @return*/public boolean contains(E element) {return indexOf(element) != ELEMENT_NOT_FOUND;}/*** 添加元素到尾部* @param element*/public void add(E element) {add(size, element);}/*** 下面三个是ArrayList和LinkedList两个实现类中的公共代码* */protected void outOfBounds(int index) {throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size);}protected void rangeCheck(int index) {if (index < 0 || index >= size) {outOfBounds(index);}}protected void rangeCheckForAdd(int index) {if (index < 0 || index > size) {outOfBounds(index);}}}
ArrayList设计
package com.wztlink1013.ds.linkedlist;/***fun:实现动态数组*/@SuppressWarnings("unchecked")public class ArrayList<E> extends AbstractList<E> {private E[] elements;private static final int DEFAULT_CAPACITY = 10;public ArrayList(int capaticy) {capaticy = (capaticy < DEFAULT_CAPACITY) ? DEFAULT_CAPACITY : capaticy;elements = (E[]) new Object[capaticy];}public ArrayList() {this(DEFAULT_CAPACITY);}@Overridepublic void clear() {for (int i = 0; i < size; i++) {elements[i] = null;}size = 0;}@Overridepublic E get(int index) {rangeCheck(index);return elements[index];}@Overridepublic E set(int index, E element) {rangeCheck(index);E old = elements[index];elements[index] = element;return old;}@Overridepublic void add(int index, E element) {rangeCheckForAdd(index);ensureCapacity(size + 1);for (int i = size; i > index; i--) {elements[i] = elements[i - 1];}elements[index] = element;size++;}@Overridepublic E remove(int index) {rangeCheck(index);E old = elements[index];for (int i = index + 1; i < size; i++) {elements[i - 1] = elements[i];}elements[--size] = null;return old;}@Overridepublic int indexOf(E element) {if (element == null) { // 1for (int i = 0; i < size; i++) {if (elements[i] == null) return i;}} else {for (int i = 0; i < size; i++) {if (element.equals(elements[i])) return i; // n}}return ELEMENT_NOT_FOUND;}/*** 保证要有capacity的容量* @param capacity*/private void ensureCapacity(int capacity) {int oldCapacity = elements.length;if (oldCapacity >= capacity) return;// 新容量为旧容量的1.5倍int newCapacity = oldCapacity + (oldCapacity >> 1);E[] newElements = (E[]) new Object[newCapacity];for (int i = 0; i < size; i++) {newElements[i] = elements[i];}elements = newElements;System.out.println(oldCapacity + "扩容为" + newCapacity);}@Overridepublic String toString() {// size=3, [99, 88, 77]StringBuilder string = new StringBuilder();string.append("size=").append(size).append(", [");for (int i = 0; i < size; i++) {if (i != 0) {string.append(", ");}string.append(elements[i]);}string.append("]");return string.toString();}/*** 新添加功能*/public int search(E element){for (int i = 0;i<size;i++){if (element == elements[i]){return i;}}return ELEMENT_NOT_FOUND;}}
LinkedList设计
package com.wztlink1013.ds.linkedlist;/***fun:链表的实现*/@SuppressWarnings("unchecked")public class LinkedList<E> extends AbstractList<E> {private Node<E> first;private Node<E> last;private static class Node<E> {E element;Node<E> prev;Node<E> next;public Node(E element, Node<E> next) {this.element = element;this.next = next;}}@Overridepublic void clear() {size = 0;first = null;last = null;}@Overridepublic E get(int index) {return node(index).element;}@Overridepublic E set(int index, E element) {Node<E> node = node(index);E old = node.element;node.element = element;return old;}@Overridepublic void add(int index, E element) {if (index == 0){first = new Node<>(element, first);} else {Node<E> prev = node(index - 1);prev.next = new Node<>(element, prev.next);}size++;}@Overridepublic E remove(int index) {// Node<E> node = first;// if (index == 0) {// first = first.next;// } else {// Node<E> prev = node(index -1);// node = prev.next;// prev.next = node.next;// }rangeCheck(index);Node<E> node = node(index);Node<E> prev = node.prev;Node<E> next = node.next;if (prev == null) { // index == 0first = next;} else {prev.next = next;}if (next == null) { // index == size - 1last = prev;} else {next.prev = prev;}size--;return node.element;}@Overridepublic int indexOf(E element) {if (element == null) {Node<E> node = first;for (int i = 0; i < size; i++) {if (node.element == null) return i;node = node.next;}} else {Node<E> node = first;for (int i = 0; i < size; i++) {if (element.equals(node.element)) return i;node = node.next;}}return ELEMENT_NOT_FOUND;}/*** 获取index位置对应的节点对象* @param index* @return*/private Node<E> node(int index) {rangeCheck(index);if (index < (size >> 1)) {Node<E> node = first;for (int i = 0; i < index; i++) {node = node.next;}return node;} else {Node<E> node = last;for (int i = size - 1; i > index; i--) {node = node.prev;}return node;}}@Overridepublic String toString() {StringBuilder string = new StringBuilder();string.append("size=").append(size).append(", [");Node<E> node = first;for (int i = 0; i < size; i++) {if (i != 0) {string.append(", ");}string.append(node);node = node.next;}string.append("]");return string.toString();}}
