Advertisement
Guest User

Untitled

a guest
Feb 17th, 2020
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.27 KB | None | 0 0
  1. package assignment1;
  2.  
  3. /**
  4. * Interface for List ADT
  5. *
  6. * @autor Abuzyar Tazetdinov
  7. */
  8. interface List<T> {
  9. /**
  10. * Check list is empty or not
  11. *
  12. * @return true if list is empty, otherwise - false
  13. */
  14. boolean isEmpty();
  15.  
  16. /**
  17. * Add element to list in place, provided by index
  18. *
  19. * @param i - index in list
  20. * @param e - element
  21. */
  22. void add(int i, T e);
  23.  
  24. /**
  25. * Add element to head of the list
  26. *
  27. * @param e - element
  28. */
  29. void addFirst(T e);
  30.  
  31. /**
  32. * Add element to tail of the list
  33. *
  34. * @param e - element
  35. */
  36. void addLast(T e);
  37.  
  38. /**
  39. * Delete all elements in list with value e if it exists in list
  40. *
  41. * @param e - element
  42. */
  43. void delete(T e);
  44.  
  45. /**
  46. * Delete element in index
  47. *
  48. * @param i - index
  49. */
  50. void delete(int i);
  51.  
  52. /**
  53. * Delete element from list head
  54. */
  55. void deleteFirst();
  56.  
  57. /**
  58. * Delete element from list tail
  59. */
  60. void deleteLast();
  61.  
  62. /**
  63. * Set element for i'th index
  64. *
  65. * @param i - index
  66. * @param e - element
  67. */
  68. void set(int i, T e);
  69.  
  70. /**
  71. * Return element in particular index
  72. *
  73. * @param i - index
  74. * @return - element
  75. */
  76. T get(int i);
  77. }
  78.  
  79.  
  80. /**
  81. * Implementation of List ADT using Array
  82. *
  83. * @author Abuzyar Tazetdinov
  84. */
  85. class DynamicArray<T> implements List<T> {
  86. /**
  87. * Count of elements in list
  88. */
  89. private int count = 0;
  90.  
  91. /**
  92. * Storage array for elements
  93. */
  94. private Object[] elements = new Object[1];
  95.  
  96. /**
  97. * Returns quantity of elements
  98. * Time complexity - O(1)
  99. */
  100. public int size() {
  101. return count;
  102. }
  103.  
  104. /**
  105. * Check list is empty or not
  106. *
  107. * @return true if list is empty, otherwise - false
  108. * Time complexity - O(1)
  109. */
  110. @Override
  111. public boolean isEmpty() {
  112. return count == 0;
  113. }
  114.  
  115. /**
  116. * Add element to list in place, provided by index
  117. * Time complexity - O(n)
  118. *
  119. * @param i - index in list
  120. * @param e - element
  121. */
  122. @Override
  123. public void add(int i, T e) {
  124. if (i < 0 || i > elements.length) {
  125. throw new IndexOutOfBoundsException();
  126. }
  127. if (count == elements.length) {
  128. doubleSize();
  129. }
  130. System.arraycopy(elements, i, elements, i + 1, count - i);
  131. elements[i] = (T) e;
  132. count++;
  133. }
  134.  
  135. /**
  136. * Increase size of array by x2
  137. * Time complexity - O(n)
  138. */
  139. private void doubleSize() {
  140. Object[] newElements = new Object[elements.length * 2];
  141. System.arraycopy(elements, 0, newElements, 0, elements.length);
  142. elements = newElements;
  143. }
  144.  
  145. /**
  146. * Add element to head of the list
  147. * Time complexity - O(n)
  148. *
  149. * @param e - element
  150. */
  151. @Override
  152. public void addFirst(T e) {
  153. add(0, e);
  154. }
  155.  
  156. /**
  157. * Add element to tail of the list
  158. * Time complexity - O(1)
  159. *
  160. * @param e - element
  161. */
  162. @Override
  163. public void addLast(T e) {
  164. add(count, e);
  165. }
  166.  
  167. /**
  168. * Delete all elements in list with value e if it exists in list
  169. * Time complexity - O(n)
  170. *
  171. * @param e - element
  172. */
  173. @Override
  174. public void delete(T e) {
  175. int i = 0;
  176. while (i < count) {
  177. if (elements[i] == e) {
  178. delete(i);
  179. } else {
  180. i++;
  181. }
  182. }
  183. }
  184.  
  185.  
  186. /**
  187. * Delete element in index
  188. * Time complexity - O(n)
  189. *
  190. * @param i - index
  191. */
  192. @Override
  193. public void delete(int i) {
  194. if (i < 0 || i > elements.length) {
  195. throw new IndexOutOfBoundsException();
  196. }
  197. System.arraycopy(elements, i + 1, elements, i, count - i);
  198. count--;
  199. }
  200.  
  201. /**
  202. * Delete element from list head
  203. * Time complexity - O(n)
  204. */
  205. @Override
  206. public void deleteFirst() {
  207. delete(0);
  208. }
  209.  
  210. /**
  211. * Delete element from list tail
  212. * Time complexity - O(1)
  213. */
  214. @Override
  215. public void deleteLast() {
  216. elements[count - 1] = null;
  217. count--;
  218. }
  219.  
  220. /**
  221. * Set element for i'th index
  222. * Time complexity - O(1)
  223. *
  224. * @param i - index
  225. * @param e - element
  226. */
  227. @Override
  228. public void set(int i, T e) {
  229. if (i < 0 || i > elements.length) {
  230. throw new IndexOutOfBoundsException();
  231. }
  232. elements[i] = e;
  233. }
  234.  
  235. /**
  236. * Return element in particular index
  237. * Time complexity - O(1)
  238. *
  239. * @param i - index
  240. * @return - element
  241. */
  242. @Override
  243. public T get(int i) {
  244. return (T) elements[i];
  245. }
  246. }
  247.  
  248. /**
  249. * Implementation of List ADT using Nodes with double links (to next and previous element)
  250. *
  251. * @author Abuzyar Tazetdinov
  252. */
  253. class DoublyLinkedList<T> implements List<T> {
  254. /**
  255. * Head of the list
  256. */
  257. Node<T> head = new Node<>();
  258.  
  259. /**
  260. * Tail of the list
  261. */
  262. Node<T> tail = head;
  263.  
  264. /**
  265. * Quantity of elements in list
  266. */
  267. int count = 0;
  268.  
  269. /**
  270. * Check list is empty or not
  271. * Time complexity - O(1)
  272. *
  273. * @return true if list is empty, otherwise - false
  274. */
  275. @Override
  276. public boolean isEmpty() {
  277. return count == 0;
  278. }
  279.  
  280. /**
  281. * Returns quantity of elements
  282. * Time complexity - O(1)
  283. */
  284. public int size() {
  285. return count;
  286. }
  287.  
  288. /**
  289. * Time complexity - O(n)
  290. *
  291. * @param i - index
  292. * @return - reference to node
  293. */
  294. private Node<T> getNodeByIndex(int i) {
  295. Node<T> current;
  296. if (count / 2 < i) { // from tail
  297. current = tail;
  298. for (int j = count - 1; j > i; j--) {
  299. current = current.prev;
  300. }
  301. } else { // from head
  302. current = head;
  303. for (int j = 0; j < i; j++) {
  304. current = current.next;
  305. }
  306. }
  307. return current;
  308. }
  309.  
  310. /**
  311. * Add element to list in place, provided by index
  312. * Time complexity - O(n)
  313. *
  314. * @param i - index in list
  315. * @param e - element
  316. */
  317. @Override
  318. public void add(int i, T e) {
  319. if (i < 0 || i > count) {
  320. throw new IndexOutOfBoundsException();
  321. }
  322. if (i == 0) {
  323. addFirst(e);
  324. } else if (i == count) {
  325. addLast(e);
  326. } else {
  327. Node<T> current = getNodeByIndex(i);
  328. Node<T> newNode = new Node<>(e);
  329. newNode.next = current.next;
  330. newNode.next.prev = newNode;
  331. newNode.prev = current;
  332. current.next = newNode;
  333. count++;
  334. }
  335. }
  336.  
  337. /**
  338. * Add element to head of the list
  339. * Time complexity - O(1)
  340. *
  341. * @param e - element
  342. */
  343. @Override
  344. public void addFirst(T e) {
  345. if (count == 0) {
  346. head.value = e;
  347. } else {
  348. Node<T> newHead = new Node<>(e);
  349. head.prev = newHead;
  350. newHead.next = head;
  351. head = newHead;
  352. }
  353. count++;
  354. }
  355.  
  356. /**
  357. * Add element to tail of the list
  358. * Time complexity - O(1)
  359. *
  360. * @param e - element
  361. */
  362. @Override
  363. public void addLast(T e) {
  364. if (count == 0) {
  365. tail.value = e;
  366. } else {
  367. Node<T> newTail = new Node<>(e);
  368. newTail.prev = tail;
  369. tail.next = newTail;
  370. tail = newTail;
  371. }
  372. count++;
  373. }
  374.  
  375. /**
  376. * Time complexity - O(1)
  377. *
  378. * @param current - node to delete
  379. */
  380. private void deleteNode(Node<T> current) {
  381. current.next.prev = current.prev;
  382. current.prev.next = current.next;
  383. count--;
  384. }
  385.  
  386. /**
  387. * Delete all elements in list with value e if it exists in list
  388. * Time complexity - O(n)
  389. *
  390. * @param e - element's value
  391. */
  392. @Override
  393. public void delete(T e) {
  394. Node<T> current = head;
  395. while (current != null) {
  396. if (current.value == e) {
  397. if (current.prev == null) {
  398. current = current.next;
  399. deleteFirst();
  400. } else if (current.next == null) {
  401. current = null;
  402. deleteLast();
  403. } else {
  404. current = current.next;
  405. deleteNode(current.prev);
  406. }
  407. } else {
  408. current = current.next;
  409. }
  410. }
  411. }
  412.  
  413. /**
  414. * Delete element in index
  415. * Time complexity - O(n)
  416. *
  417. * @param i - index
  418. */
  419. @Override
  420. public void delete(int i) {
  421. if (i < 0 || i > count) {
  422. throw new IndexOutOfBoundsException();
  423. }
  424. if (i == 0) {
  425. deleteFirst();
  426. } else if (count - 1 == i) {
  427. deleteLast();
  428. } else {
  429. deleteNode(getNodeByIndex(i));
  430. }
  431. }
  432.  
  433. /**
  434. * Delete element from list head
  435. * Time complexity - O(1)
  436. */
  437. @Override
  438. public void deleteFirst() {
  439. if (head.next != null) {
  440. head = head.next;
  441. head.prev = null;
  442. } else {
  443. head.value = null;
  444. }
  445. count--;
  446. }
  447.  
  448. /**
  449. * Delete element from list tail
  450. * Time complexity - O(1)
  451. */
  452. @Override
  453. public void deleteLast() {
  454. if (tail.prev != null) {
  455. tail = tail.prev;
  456. tail.next = null;
  457. } else {
  458. tail.value = null;
  459. }
  460. count--;
  461. }
  462.  
  463. /**
  464. * Set element for i'th index
  465. * Time complexity - O(n)
  466. *
  467. * @param i - index
  468. * @param e - element
  469. */
  470. @Override
  471. public void set(int i, T e) {
  472. if (i < 0 || i > count) {
  473. throw new IndexOutOfBoundsException();
  474. }
  475. if (i == 0) {
  476. head.value = e;
  477. } else if (count == i - 1) {
  478. tail.value = e;
  479. } else {
  480. getNodeByIndex(i).value = e;
  481. }
  482. }
  483.  
  484. /**
  485. * Return element in particular index
  486. * Time complexity - O(n)
  487. *
  488. * @param i - index
  489. * @return - element
  490. */
  491. @Override
  492. public T get(int i) {
  493. if (i < 0 || i > count || count == 0) {
  494. throw new IndexOutOfBoundsException();
  495. }
  496. if (i == 0) {
  497. return head.value;
  498. } else if (count - 1 == i) {
  499. return tail.value;
  500. }
  501. return getNodeByIndex(i).value;
  502. }
  503. }
  504.  
  505. /**
  506. * Class for Node in Doubly Linked List
  507. *
  508. * @autor Abuzyar Tazetdinov
  509. */
  510. class Node<T> {
  511. /**
  512. * Reference to previous element
  513. */
  514. public Node<T> prev = null;
  515.  
  516. /**
  517. * Reference to next element
  518. */
  519. public Node<T> next = null;
  520.  
  521. /**
  522. * Node's value
  523. */
  524. public T value = null;
  525.  
  526. public Node() {
  527. }
  528.  
  529. public Node(T v) {
  530. value = v;
  531. }
  532. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement