在之前我们封装了一些操作在接口类中,并在抽象类实现了相同的方法。下面我们开始写代码:
无头结点单链表:(注意下面的AbstractList是之前抽取的类,不是java.util包下的类)
public class SingleLinkedList<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) { /* * 最好:O(1) * 最坏:O(n) * 平均:O(n) */ return node(index).element; } @Override public E set(int index, E element) { /* * 最好:O(1) * 最坏:O(n) * 平均:O(n) */ Node<E> node = node(index); E old = node.element; node.element = element; return old; } @Override public void add(int index, E element) { /* * 最好:O(1) * 最坏:O(n) * 平均:O(n) */ rangeCheckForAdd(index); if (index == 0) { first = new Node<>(element, first); } else { Node<E> prev = node(index - 1); prev.next = new Node<>(element, prev.next); } size++; } @Override public E remove(int index) { /* * 最好:O(1) * 最坏:O(n) * 平均:O(n) */ rangeCheck(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; } 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位置对应的节点对象 * * @param index * @return */ private Node<E> node(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 SingleLinkedList<E> extends AbstractList<E> { private Node<E> first; public SingleLinkedList() { first = new Node<>(null, null); } 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 node(index).element; } @Override public E set(int index, E element) { Node<E> node = node(index); E old = node.element; node.element = element; return old; } @Override public void add(int index, E element) { rangeCheckForAdd(index); Node<E> prev = index == 0 ? first : node(index - 1); prev.next = new Node<>(element, prev.next); size++; } @Override public E remove(int index) { rangeCheck(index); Node<E> prev = index == 0 ? first : node(index - 1); Node<E> 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位置对应的节点对象 * @param index * @return */ private Node<E> node(int index) { rangeCheck(index); Node<E> node = first.next; 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.next; for (int i = 0; i < size; i++) { if (i != 0) { string.append(", "); } string.append(node.element); node = node.next; } string.append("]"); return string.toString(); } }