Guest User

Untitled

a guest
Jul 21st, 2018
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.85 KB | None | 0 0
  1. package com.rustem.simplecrudapplication.model;
  2.  
  3. public class Main {
  4. public static void main(String[] args) {
  5. MyLinkedList<Object> myList = new MyLinkedList<>();
  6.  
  7. for (int i = 0; i < 5_000_000; i++) {
  8. myList.add(i);
  9. }
  10. System.out.println("Закончили" + "\n");
  11.  
  12. myList.lastNode.setNextN(myList.head.nextN.nextN.nextN.nextN.nextN.nextN.nextN.nextN.nextN.nextN); // возвращаем цикл на 10-ый элемент
  13.  
  14. new Thread(() -> {
  15. long t1 = System.currentTimeMillis();
  16. System.out.println(myList.hasLoopN(myList.head) ? "Цикл есть" : "Цикла нет");
  17. long t2 = System.currentTimeMillis();
  18. System.out.println("Время на поиск цикла с шагом 1/N: " + (t2 - t1));
  19. }).start();
  20.  
  21. new Thread(() -> {
  22. long t3 = System.currentTimeMillis();
  23. System.out.println(myList.hasLoop2(myList.head) ? "Цикл есть" : "Цикла нет");
  24. long t4 = System.currentTimeMillis();
  25. System.out.println("Время на поиск цикла с шагом 1/2: " + (t4 - t3));
  26. }).start();
  27. }
  28. }
  29.  
  30. class Node<E> {
  31. E index;
  32. Node<E> nextN;
  33.  
  34. void setNextN(Node<E> nextN) {
  35. this.nextN = nextN;
  36. }
  37. }
  38.  
  39. class MyLinkedList<E> {
  40. Node<E> head;
  41. Node<E> lastNode;
  42. private int size;
  43. private int step2;
  44. private int step1;
  45.  
  46. public int size() {
  47. return size;
  48. }
  49.  
  50. /**
  51. * Возвращает элемент в указанной позиции в этом списке
  52. *
  53. * @param index индекс возвращаемого элемента
  54. * @return элемент в указанной позиции в этом списке
  55. */
  56. public E get(int index) {
  57. checkElementIndex(index);
  58. return node(index).index;
  59. }
  60.  
  61. void printNodes() {
  62. Node<E> n = head;
  63. while (n != null) {
  64. System.out.print(n.index + " ");
  65. n = n.nextN;
  66. }
  67. System.out.println();
  68. }
  69.  
  70. /**
  71. * Добавляет указанный элемент в конец списка.
  72. *
  73. * @param element элемент, который будет добавлен в этот список
  74. */
  75. void add(E element) {
  76. size++;
  77. Node<E> n = new Node<>();
  78. n.index = element;
  79. if (lastNode == null) {
  80. head = n;
  81. lastNode = n;
  82. } else {
  83. lastNode.nextN = n;
  84. lastNode = n;
  85. }
  86. }
  87.  
  88. /**
  89. * первый метод проверяющий на зацикленность
  90. *
  91. * @param first первый элемент ноды
  92. */
  93. boolean hasLoopN(Node first) {
  94. if (first == null)
  95. return false;
  96.  
  97. Node slow;
  98. Node fast;
  99.  
  100. slow = fast = first;
  101.  
  102. while (true) {
  103.  
  104. slow = slow.nextN;
  105.  
  106. if (fast.nextN != null) {
  107. fast = fast.nextN.nextN.nextN.nextN.nextN.nextN.nextN;
  108. step1++;
  109. } else {
  110. return false;
  111. }
  112.  
  113. if (slow == null || fast == null) {
  114. return false;
  115. }
  116.  
  117. if (slow == fast) {
  118. System.out.println("Количество итераций: " + step1);
  119. return true;
  120. }
  121. }
  122. }
  123.  
  124. boolean hasLoop2(Node first) {
  125. if (first == null)
  126. return false;
  127.  
  128. Node slow;
  129. Node fast;
  130.  
  131. slow = fast = first;
  132.  
  133. while (true) {
  134.  
  135. slow = slow.nextN;
  136.  
  137. if (fast.nextN != null) {
  138. fast = fast.nextN.nextN;
  139. step2++;
  140. } else {
  141. return false;
  142. }
  143.  
  144. if (slow == null || fast == null) {
  145. return false;
  146. }
  147.  
  148. if (slow == fast) {
  149. System.out.println("Количество итераций: " + step2);
  150. return true;
  151. }
  152. }
  153. }
  154.  
  155. /**
  156. * Возвращает узел по указанному индексу.
  157. */
  158. private Node<E> node(int index) {
  159. // assert isElementIndex(index);
  160.  
  161. if (index < size) {
  162. Node<E> x = head;
  163. for (int i = 0; i < index; i++)
  164. x = x.nextN;
  165. return x;
  166. }
  167. return null;
  168. }
  169.  
  170. private void checkElementIndex(int index) {
  171. if (!isElementIndex(index))
  172. throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
  173. }
  174.  
  175. /**
  176. * Является ли аргумент индексом созданного элемента.
  177. */
  178. private boolean isElementIndex(int index) {
  179. return index >= 0 && index < size;
  180. }
  181.  
  182. private String outOfBoundsMsg(int index) {
  183. return "Index: " + index + ", Size: " + size;
  184. }
  185. }
Add Comment
Please, Sign In to add comment