LinkedList.java 3.1 KB

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