DLList.java 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. import java.util.Iterator;
  2. import java.util.NoSuchElementException;
  3. // Doubly Linked List
  4. public class DLList<T> implements Iterable<T> {
  5. // Main method to test this class
  6. public static void main(String[] args) {
  7. // Add random numbers to a new list:
  8. DLList<Integer> aList = new DLList<Integer>();
  9. for (int i = 0; i < 20; i++) aList.add((int) (Math.random() * 100));
  10. // Print list using for-each loop:
  11. for (Integer i : aList) System.out.print(i + " ");
  12. System.out.println();
  13. // Print list using iterator methods:
  14. DLList<Integer>.DLListIterator iter = aList.iterator(20);
  15. while (iter.hasPrevious()) System.out.print(iter.previous() + " ");
  16. System.out.println();
  17. while (iter.hasNext()) System.out.print(iter.next() + " ");
  18. System.out.println();
  19. while (iter.hasPrevious()) System.out.print(iter.previous() + " ");
  20. System.out.println();
  21. }
  22. private class Node {
  23. T element;
  24. Node next;
  25. Node prev;
  26. public Node(T element) {
  27. this.element = element;
  28. }
  29. }
  30. // Linked List Iterator class
  31. private class DLListIterator implements Iterator<T> {
  32. private Node walker;
  33. private DLListIterator() {
  34. walker = head;
  35. }
  36. private DLListIterator(Integer index) {
  37. walker = head;
  38. for (int i = 0; i < index; i++) {
  39. next();
  40. }
  41. }
  42. @Override
  43. public boolean hasNext() {
  44. return walker != null;
  45. }
  46. public boolean hasPrevious() {
  47. return walker == null || walker.prev != null;
  48. }
  49. @Override
  50. public T next() {
  51. if (hasNext()) {
  52. T element = walker.element;
  53. walker = walker.next;
  54. return element;
  55. } else throw new NoSuchElementException();
  56. }
  57. public T previous() {
  58. if (hasPrevious()) {
  59. if (walker == null) {
  60. walker = tail;
  61. } else {
  62. walker = walker.prev;
  63. }
  64. T element = walker.element;
  65. return element;
  66. } else throw new NoSuchElementException();
  67. }
  68. }
  69. private Node head;
  70. private Node tail;
  71. private int size;
  72. // Add to end of list
  73. public void add(T element) {
  74. add(size, element);
  75. }
  76. // Add to list at given index
  77. public void add(int index, T element) {
  78. if (index < 0 || index > size) throw new IndexOutOfBoundsException(
  79. "" + index
  80. );
  81. Node n = new Node(element);
  82. if (head == null) {
  83. // list empty
  84. head = tail = n;
  85. } else if (index == 0) {
  86. // add to head
  87. n.next = head;
  88. head.prev = n;
  89. head = n;
  90. } else if (index == size) {
  91. // add to tail
  92. n.prev = tail;
  93. tail.next = n;
  94. tail = n;
  95. } else {
  96. // general case
  97. Node walker = head;
  98. for (int i = 0; i < index - 1; i++) walker = walker.next;
  99. n.next = walker.next;
  100. n.prev = walker;
  101. walker.next = n;
  102. n.next.prev = n;
  103. }
  104. size++;
  105. }
  106. public int size() {
  107. return size;
  108. }
  109. @Override
  110. public String toString() {
  111. if (size == 0) return "[]";
  112. String s = "[";
  113. Node walker = head;
  114. while (walker != tail) {
  115. s += walker.element + ", ";
  116. walker = walker.next;
  117. }
  118. return s + walker.element + "]";
  119. }
  120. @Override
  121. public Iterator<T> iterator() {
  122. return new DLListIterator();
  123. }
  124. public DLListIterator iterator(Integer i) {
  125. return new DLListIterator(i);
  126. }
  127. }