不带虚拟头节点的单链表原理及实现
作者:互联网
不带虚拟头节点的单链表:
接口设计:
public interface List<E> {
public static final int ELEMENT_NOT_FOUND = -1;
// 清除所有的元素
void clear();
// 返回元素的个数
int size();
// 判断是否为空
boolean isEmpty();
// 判断是否包含指定元素
boolean contains(E element);
// 将指定的元素追加到末尾
void add(E element);
// 返回指定索引处的元素
E get(int index);
// 修改指定索引处的元素,返回被修改的元素
E set(int index, E element);
// 在指定索引处插入指定的元素
void add(int index, E element);
// 删除指定索引处的元素,返回被删除的元素
E remove(int index);
// 返回指定元素的索引
int indexOf(E element);
}
public abstract class AbstractList<E> implements List<E> {
protected int size; // 存储元素的个数
// 返回元素的个数
@Override
public int size() {
return size;
}
// 判断是否为空
@Override
public boolean isEmpty() {
return size == 0;
}
// 判断是否包含指定元素
@Override
public boolean contains(E element) {
return indexOf(element) != ELEMENT_NOT_FOUND;
}
// 将指定的元素追加到末尾
@Override
public void add(E element) {
add(size, element);
}
protected void rangeCheck(int index) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size);
}
}
protected void rangeCheckForAdd(int index) {
if (index < 0 || index > size) {
throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size);
}
}
}
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);
}
// 清除所有的元素
@Override
public void clear() {
for (int i = 0; i < size; i++) {
elements[i] = null;
}
size = 0;
}
// 返回指定索引处的元素
@Override
public E get(int index) {
rangeCheck(index);
return elements[index];
}
// 修改指定索引处的元素,返回被修改的元素
@Override
public E set(int index, E element) {
rangeCheck(index);
E old = elements[index];
elements[index] = element;
return old;
}
// 在指定索引处插入指定的元素
@Override
public void add(int index, E element) {
// 加上这句,就不允许存储null了
// if (element == null) return;
rangeCheckForAdd(index);
ensureCapacity(size + 1);
for (int i = size; i > index; i--) {
elements[i] = elements[i - 1];
}
elements[index] = element;
size++;
}
// 删除指定索引处的元素,返回被删除的元素
@Override
public E remove(int index) {
rangeCheck(index);
E old = elements[index];
for (int i = index + 1; i < size; i++) {
elements[i - 1] = elements[i];
}
// size--;
// elements[size] = null;
elements[--size] = null;
return old;
}
// 返回指定元素的索引
@Override
public int indexOf(E element) {
if (element == null) {
for (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;
}
}
return ELEMENT_NOT_FOUND;
}
// 保证要有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);
}
@Override
public String toString() {
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]);
// if (i != size - 1) string.append(", ");
}
string.append("]");
return string.toString();
}
}
public class LinkedList<E> extends AbstractList<E> {
private Node<E> first; // 指向第一个元素结点
private static class Node<E> {
E element;
Node<E> next;
public Node(E element, Node<E> next) {
this.element = element;
this.next = next;
}
}
// 清除所有的元素
@Override
public void clear() {
size = 0;
first = null;
}
// 返回指定索引处的元素
@Override
public E get(int index) {
return nodeOf(index).element;
}
// 修改指定索引处的元素,返回被修改的元素
@Override
public E set(int index, E element) {
Node<E> node = nodeOf(index);
E old = node.element;
node.element = element;
return old;
}
// 在指定索引处插入指定的元素
@Override
public void add(int index, E element) {
if (index == 0) {
first = new Node<>(element, first);
} else {
Node<E> prev = nodeOf(index - 1);
prev.next = new Node<>(element, prev.next);
}
size++;
}
// 删除指定索引处的元素,返回被删除的元素
@Override
public E remove(int index) {
Node<E> node = first;
if (index == 0) {
first = first.next;
} else {
Node<E> prev = nodeOf(index - 1);
node = prev.next;
prev.next = node.next;
}
size--;
return node.element;
}
// 返回指定元素的索引
@Override
public 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索引处的结点对象
private Node<E> nodeOf(int index) {
rangeCheck(index);
Node<E> node = first;
for (int i = 0; i < index; i++) {
node = node.next;
}
return node;
}
@Override
public 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.element);
node = node.next;
}
string.append("]");
return string.toString();
}
}
public class Main {
public static void main(String[] args) {
List<Integer> list = new LinkedList<Integer>();
list.add(20);
list.add(0, 44);
list.add(30);
list.add(list.size(), 55);
list.remove(1);
System.out.println(list);
List<Integer> list2 = new ArrayList<Integer>();
list2.add(20);
list2.add(0, 44);
list2.add(30);
list2.add(list.size(), 55);
list2.remove(1);
System.out.println(list);
}
}
标签:node,index,单链,int,element,public,不带,节点,size 来源: https://blog.csdn.net/qq_42815188/article/details/121628494