Advertisement
Guest User

Untitled

a guest
Oct 15th, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.99 KB | None | 0 0
  1. package linked_list;
  2.  
  3. import java.util.Iterator;
  4.  
  5. public class LinkedList<E> implements Iterable<E> {
  6.  
  7. private Node<E> head;
  8. private Node<E> tail;
  9. private int size;
  10.  
  11. public int size() {
  12. return this.size;
  13. }
  14.  
  15. public boolean add(E item) {
  16. int oldSize = this.size;
  17. addLast(item);
  18. return oldSize < this.size;
  19. }
  20.  
  21. public void add(int index, E element) {
  22. if(index == 0) {
  23. addFirst(element);
  24. return;
  25. } else if(index == size) {
  26. addLast(element);
  27. return;
  28. }
  29. checkSize(index);
  30. Node<E> currentNode = head;
  31. Node<E> newNode = new Node<>(element);
  32. Node<E> previousNode = currentNode;
  33. for (int i = 0; i <= index; i++) {
  34. if(i == index) {
  35. currentNode.setNext(currentNode.getNext());
  36. newNode.setNext(currentNode);
  37. previousNode.setNext(newNode);
  38. size++;
  39. return;
  40. }
  41. previousNode = currentNode;
  42. currentNode = currentNode.getNext();
  43. }
  44. }
  45.  
  46. public void addFirst(E element) {
  47. Node<E> oldHead = this.head;
  48. this.head = new Node<>(element);
  49. this.head.setNext(oldHead);
  50.  
  51. if (this.tail == null) {
  52. this.tail = this.head;
  53. this.head.setNext(tail);
  54. this.tail.setNext(null);
  55. }
  56. this.size++;
  57. }
  58.  
  59. public void addLast(E element) {
  60. Node<E> oldTail = this.tail;
  61. this.tail = new Node<>(element);
  62. this.tail.setNext(null);
  63.  
  64. if (oldTail != null) {
  65. oldTail.setNext(tail);
  66. } else if (this.head == null) {
  67. this.head = this.tail;
  68. }
  69. this.size++;
  70. }
  71.  
  72. public E remove() {
  73. return removeFirst();
  74. }
  75.  
  76. public E remove(int index) {
  77. checkSize(index);
  78. Node<E> elementToRemove = head;
  79. Node<E> previousNode = elementToRemove;
  80. for (int i = 0; i < index; i++) {
  81. previousNode = elementToRemove;
  82. elementToRemove = elementToRemove.getNext();
  83. }
  84.  
  85. if (elementToRemove == head) {
  86. head = elementToRemove.getNext();
  87. } else if (elementToRemove == tail) {
  88. tail = previousNode;
  89. tail.setNext(null);
  90. } else {
  91. previousNode.setNext(elementToRemove.getNext());
  92. }
  93. size--;
  94. return elementToRemove.getValue();
  95. }
  96.  
  97. public boolean remove(E element) {
  98. checkSize();
  99. int indexOfElement = 0;
  100. Node<E> currentNode = head;
  101. for (int i = 0; i < size; i++) {
  102. if(currentNode.getValue() == element) {
  103. indexOfElement = i;
  104. remove(indexOfElement);
  105. return true;
  106. }
  107. currentNode = currentNode.getNext();
  108. }
  109. return false;
  110. }
  111.  
  112. public E removeFirst() {
  113. checkSize();
  114. E oldHeadValue = this.head.getValue();
  115. Node<E> oldHead = this.head;
  116. this.head = oldHead.getNext();
  117. size--;
  118. return oldHeadValue;
  119. }
  120.  
  121. public E removeLast() {
  122. checkSize();
  123. E oldTailValue = this.tail.getValue();
  124. Node<E> currentNode = this.head;
  125. Node<E> newTail = null;
  126. while (true) {
  127. if (currentNode.getNext() != null) {
  128. newTail = currentNode;
  129. } else {
  130. break;
  131. }
  132. currentNode = currentNode.getNext();
  133. }
  134. this.tail = newTail;
  135. if (this.tail != null) {
  136. this.tail.setNext(null);
  137. }
  138. size--;
  139. return oldTailValue;
  140. }
  141.  
  142. @Override
  143. public Iterator<E> iterator() {
  144. return new LinkedListIterator();
  145. }
  146.  
  147. private final class LinkedListIterator implements Iterator<E> {
  148. int count = 0;
  149.  
  150. @Override
  151. public boolean hasNext() {
  152. return count < size;
  153. }
  154.  
  155. @Override
  156. public E next() {
  157. count++;
  158. E node = head.getValue();
  159. head = head.getNext();
  160. return node;
  161. }
  162. }
  163.  
  164. private void checkSize() {
  165. if (this.size == 0) {
  166. throw new IllegalArgumentException("Size must be positive");
  167. }
  168. }
  169.  
  170. private void checkSize(int index) {
  171. checkSize();
  172. if (size < index) {
  173. throw new IndexOutOfBoundsException("Index out of range!");
  174. }
  175. }
  176.  
  177. @Override
  178. public String toString() {
  179. Node<E> node = head;
  180. final StringBuilder sb = new StringBuilder("LinkedList{");
  181. while (node != null) {
  182. sb.append(node.getValue());
  183. if(node.getNext() != null) {
  184. sb.append(", ");
  185. }
  186. node = node.getNext();
  187. }
  188. sb.append('}');
  189. return sb.toString();
  190. }
  191. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement