DoublyLinkedList.java 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. import java.util.NoSuchElementException;
  2. /**
  3. * An implementation of the Linked List data structure.
  4. *
  5. * The LinkedList is like the ArrayList, except the list's
  6. * elements are stored in linked nodes instead of an array.
  7. *
  8. * @param <E> component type
  9. */
  10. public class DoublyLinkedList<E> {
  11. public static void main(String[] args) {
  12. DoublyLinkedList<Integer> list = new DoublyLinkedList<>();
  13. for (int i = 2; i <= 20; i += 2) list.add(i);
  14. System.out.println(list);
  15. list.removeFirst();
  16. list.removeLast();
  17. list.printReverse();
  18. }
  19. // The list's elements are stored in nodes.
  20. private class Node {
  21. E element; // Element stored in this node
  22. Node next; // Link to the next node in the list
  23. Node previous; // Link to the previous node in the list
  24. }
  25. private Node head; // Link to the first node
  26. private Node tail; // Link to the last node
  27. private int size; // Number of elements in the list
  28. public void add(E elem) {
  29. Node n = new Node();
  30. n.element = elem;
  31. if (head == null) head = tail = n;
  32. else {
  33. n.previous = tail;
  34. tail.next = n;
  35. tail = n;
  36. }
  37. size++;
  38. }
  39. public void add(int index, E elem) {
  40. if (index < 0 || index > size) throw new IndexOutOfBoundsException(
  41. index + ""
  42. );
  43. Node n = new Node();
  44. n.element = elem;
  45. if (index == 0) {
  46. n.next = head;
  47. head = n;
  48. if (tail == null) tail = n;
  49. } else {
  50. Node walker = head;
  51. for (int i = 0; i < index - 1; i++) {
  52. walker = walker.next;
  53. }
  54. n.next = walker.next;
  55. walker.next = n;
  56. if (n.next == null) tail = n;
  57. }
  58. size++;
  59. }
  60. public E get(int index) {
  61. if (index < 0 || index >= size) throw new IndexOutOfBoundsException(
  62. index + ""
  63. );
  64. Node walker = head;
  65. for (int i = 0; i < index; i++) walker = walker.next;
  66. return walker.element;
  67. }
  68. public void set(int index, E element) {
  69. if (index < 0 || index >= size) throw new IndexOutOfBoundsException(
  70. index + ""
  71. );
  72. Node walker = head;
  73. for (int i = 0; i < index; i++) walker = walker.next;
  74. walker.element = element;
  75. }
  76. public E get(E element) {
  77. Node walker = head;
  78. for (int i = 0; i < size; i++) {
  79. if (walker.element.equals(element)) {
  80. return walker.element;
  81. }
  82. walker = walker.next;
  83. }
  84. return null;
  85. }
  86. public boolean contains(E element) {
  87. Node walker = head;
  88. for (int i = 0; i < size; i++) {
  89. if (walker.element.equals(element)) {
  90. return true;
  91. }
  92. walker = walker.next;
  93. }
  94. return false;
  95. }
  96. public int size() {
  97. return size;
  98. }
  99. public void removeFirst() {
  100. if (size == 0) throw new NoSuchElementException();
  101. if (size == 1) {
  102. head = tail = null;
  103. } else {
  104. head = head.next;
  105. head.previous = null;
  106. }
  107. size--;
  108. }
  109. public void removeLast() {
  110. if (size == 0) throw new NoSuchElementException();
  111. if (size == 1) {
  112. head = tail = null;
  113. } else {
  114. tail = tail.previous;
  115. tail.next = null;
  116. }
  117. size--;
  118. }
  119. public void printReverse() {
  120. Node walker = tail;
  121. while (walker != null) {
  122. System.out.println(walker.element);
  123. walker = walker.previous;
  124. }
  125. }
  126. @Override
  127. public String toString() {
  128. if (head == null) return "[]";
  129. else {
  130. String s = "[";
  131. Node walker = head;
  132. while (walker != tail) {
  133. s += walker.element + ", ";
  134. walker = walker.next;
  135. }
  136. s += tail.element + "]";
  137. return s;
  138. }
  139. }
  140. }