| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 |
- import java.util.NoSuchElementException;
- /**
- * An implementation of the Linked List data structure.
- *
- * The LinkedList is like the ArrayList, except the list's
- * elements are stored in linked nodes instead of an array.
- *
- * @param <E> component type
- */
- public class DoublyLinkedList<E> {
- public static void main(String[] args) {
- DoublyLinkedList<Integer> list = new DoublyLinkedList<>();
- for (int i = 2; i <= 20; i += 2) list.add(i);
- System.out.println(list);
- list.removeFirst();
- list.removeLast();
- list.printReverse();
- }
- // The list's elements are stored in nodes.
- private class Node {
- E element; // Element stored in this node
- Node next; // Link to the next node in the list
- Node previous; // Link to the previous node in the list
- }
- private Node head; // Link to the first node
- private Node tail; // Link to the last node
- private int size; // Number of elements in the list
- public void add(E elem) {
- Node n = new Node();
- n.element = elem;
- if (head == null) head = tail = n;
- else {
- n.previous = tail;
- tail.next = n;
- tail = n;
- }
- size++;
- }
- public void add(int index, E elem) {
- if (index < 0 || index > size) throw new IndexOutOfBoundsException(
- index + ""
- );
- Node n = new Node();
- n.element = elem;
- if (index == 0) {
- n.next = head;
- head = n;
- if (tail == null) tail = n;
- } else {
- Node walker = head;
- for (int i = 0; i < index - 1; i++) {
- walker = walker.next;
- }
- n.next = walker.next;
- walker.next = n;
- if (n.next == null) tail = n;
- }
- size++;
- }
- public E get(int index) {
- if (index < 0 || index >= size) throw new IndexOutOfBoundsException(
- index + ""
- );
- Node walker = head;
- for (int i = 0; i < index; i++) walker = walker.next;
- return walker.element;
- }
- public void set(int index, E element) {
- if (index < 0 || index >= size) throw new IndexOutOfBoundsException(
- index + ""
- );
- Node walker = head;
- for (int i = 0; i < index; i++) walker = walker.next;
- walker.element = element;
- }
- public E get(E element) {
- Node walker = head;
- for (int i = 0; i < size; i++) {
- if (walker.element.equals(element)) {
- return walker.element;
- }
- walker = walker.next;
- }
- return null;
- }
- public boolean contains(E element) {
- Node walker = head;
- for (int i = 0; i < size; i++) {
- if (walker.element.equals(element)) {
- return true;
- }
- walker = walker.next;
- }
- return false;
- }
- public int size() {
- return size;
- }
- public void removeFirst() {
- if (size == 0) throw new NoSuchElementException();
- if (size == 1) {
- head = tail = null;
- } else {
- head = head.next;
- head.previous = null;
- }
- size--;
- }
- public void removeLast() {
- if (size == 0) throw new NoSuchElementException();
- if (size == 1) {
- head = tail = null;
- } else {
- tail = tail.previous;
- tail.next = null;
- }
- size--;
- }
- public void printReverse() {
- Node walker = tail;
- while (walker != null) {
- System.out.println(walker.element);
- walker = walker.previous;
- }
- }
- @Override
- public String toString() {
- if (head == null) return "[]";
- else {
- String s = "[";
- Node walker = head;
- while (walker != tail) {
- s += walker.element + ", ";
- walker = walker.next;
- }
- s += tail.element + "]";
- return s;
- }
- }
- }
|