Advertisement
Guest User

Untitled

a guest
Oct 20th, 2019
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.24 KB | None | 0 0
  1. /**
  2. * @author Eimutis Karčiauskas, KTU IF Programų inžinerijos katedra, 2014 09 23
  3. *
  4. * Tai pirmoji kompleksinės duomenų struktūros klasė, kuri leidžia apjungti
  5. * atskirus objektus į vieną visumą - sąrašą. Objektai, kurie bus dedami į
  6. * sąrašą, turi tenkinti interfeisą Comparable<E>.
  7. *
  8. * Užduotis: Peržiūrėkite ir išsiaiškinkite pateiktus metodus. Metodų algoritmai
  9. * yra aptarti paslaitos metu. Realizuokite nurodytus metodus.
  10. * ****************************************************************************
  11. */
  12. package edu.ktu.ds.lab1b.util;
  13.  
  14. import java.util.Arrays;
  15. import java.util.Comparator;
  16.  
  17. /**
  18. * Koreguota 2015-09-18
  19. *
  20. * @author Aleksis
  21. * @param <E> Sąrašo elementų tipas (klasė)
  22. */
  23. public class LinkedList<E extends Comparable<E>>
  24. implements List<E>, Iterable<E>, Cloneable {
  25.  
  26. private Node<E> first; // rodyklė į pirmą mazgą
  27. private Node<E> last; // rodyklė į paskutinį mazgą
  28. private Node<E> current; // rodyklė į einamąjį mazgą, naudojama getNext
  29. private int size; // sąrašo dydis, tuo pačiu elementų skaičius
  30.  
  31. /**
  32. * Constructs an empty list.
  33. */
  34. public LinkedList() {
  35. }
  36.  
  37. /**
  38. * metodas add įdeda elementą į sąrašo pabaigą
  39. *
  40. * @param e - tai įdedamas elementas (jis negali būti null)
  41. * @return true, jei operacija atlikta sėkmingai
  42. */
  43. @Override
  44. public boolean add(E e) {
  45. if (e == null) {
  46. return false; // nuliniai objektai nepriimami
  47. }
  48. if (first == null) {
  49. first = new Node<>(e, first);
  50. last = first;
  51. } else {
  52. Node<E> e1 = new Node(e, null);
  53. last.next = e1;
  54. last = e1;
  55. }
  56. size++;
  57. return true;
  58. }
  59.  
  60. /**
  61. * Įterpia elementą prieš k-ąją poziciją
  62. *
  63. * @param k pozicija
  64. * @param e įterpiamasis elementas
  65. * @return jei k yra blogas, grąžina null
  66. */
  67. @Override
  68. public boolean add(int k, E e) {
  69. Node<E> newNode = new Node<>(e, null);
  70. if (e == null) {
  71. return false;
  72. }
  73. if (k < 0 || k >= size) {
  74. return false;
  75. }
  76. if (k == 0) {
  77. newNode.next = first;
  78. first = newNode;
  79. size++;
  80. }
  81. if (k>0)
  82. {
  83. Node<E> node = first;
  84. while(--k > 0)
  85. {
  86. node = node.next;
  87. }
  88. newNode.next = node.next;
  89. node.next = newNode;
  90. size++;
  91. }
  92. return true;
  93. }
  94.  
  95. public Node<E> removeLast()
  96. {
  97. Node<E> originalLast = last;
  98. if (first == null)
  99. return null;
  100.  
  101. if (first.next == null) {
  102. return null;
  103. }
  104.  
  105. // Find the second last node
  106. Node<E> second_last = first;
  107. if(second_last.next.next != null) {
  108. while (second_last.next.next != null)
  109. second_last = second_last.next;
  110. }
  111. last = second_last;
  112. // Change next of second last
  113. second_last.next = null;
  114. size--;
  115. return originalLast;
  116. }
  117.  
  118. public boolean addAll( LinkedList<? extends E> c)
  119. {
  120. for (Node<? extends E> e1 = c.first; e1 != null; e1 = e1.next) {
  121. this.add(e1.element);
  122. }
  123. return true;
  124. }
  125.  
  126. public int indexOf(Object o)
  127. {
  128. int index = 0;
  129. current = first;
  130.  
  131. while (current != null) {
  132. if (o.equals(current.element)) {//current.element==(o)
  133. return index;
  134. }
  135. index++;
  136. current = current.next;
  137. }
  138. return -1;
  139. }
  140.  
  141. /**
  142. *
  143. * @return sąrašo dydis (elementų kiekis)
  144. */
  145. @Override
  146. public int size() {
  147. return size;
  148. }
  149.  
  150. /**
  151. * patikrina ar sąrašas yra tuščias
  152. *
  153. * @return true, jei tuščias
  154. */
  155. @Override
  156. public boolean isEmpty() {
  157. return first == null;
  158. }
  159.  
  160. /**
  161. * Išvalo sąrašą
  162. */
  163. @Override
  164. public void clear() {
  165. size = 0;
  166. first = null;
  167. last = null;
  168. current = null;
  169. }
  170.  
  171. /**
  172. * Grąžina elementą pagal jo indeksą (pradinis indeksas 0)
  173. *
  174. * @param k indeksas
  175. * @return k-ojo elemento reikšmę; jei k yra blogas, gąžina null
  176. */
  177. @Override
  178. public E get(int k) {
  179. if (k < 0 || k >= size) {
  180. return null;
  181. }
  182. current = first.findNode(k);
  183. return current.element;
  184. }
  185.  
  186. /**
  187. * Pakeičia k-ojo elemento reikšmę
  188. *
  189. * @param k keičiamo elemento indeksas
  190. * @param e nauja elemento reikšmė
  191. * @return senoji reikšmė
  192. */
  193. @Override
  194. public E set(int k, E e) {
  195. if (e == null) return null;
  196. if (k < 0 || k>= size) return null;
  197. current = first.findNode(k);
  198. E oldElement = current.element;
  199. current.element = e;
  200. return oldElement;
  201.  
  202. }
  203.  
  204. /**
  205. * pereina prie kitos reikšmės ir ją grąžina
  206. *
  207. * @return kita reikšmė
  208. */
  209. @Override
  210. public E getNext() {
  211. if (current == null) {
  212. return null;
  213. }
  214. current = current.next;
  215. if (current == null) {
  216. return null;
  217. }
  218. return current.element;
  219. }
  220.  
  221. /**
  222. * Šalina elementą pagal indeksą
  223. *
  224. * @param k šalinamojo indeksas
  225. * @return pašalintas elementas
  226. */
  227. @Override
  228. public E remove(int k) {
  229. // throw new UnsupportedOperationException("Studentams reikia realizuoti remove(int k)");
  230. if (k<0 || k>= size) return null;
  231. Node<E> actual = null;
  232. if (k==0)
  233. {
  234. actual = first; first = actual.next;
  235. if (first == null) last= null;
  236. }
  237. else {
  238. Node<E> previous = first.findNode(k-1);
  239. actual = previous.next;
  240. previous.next = actual.next;
  241. if (actual.next == null) last = previous;
  242. }
  243. size--;
  244. return actual.element;
  245. }
  246.  
  247. /**
  248. *
  249. * @return sąrašo kopiją
  250. */
  251. @Override
  252. public LinkedList<E> clone() {
  253. LinkedList<E> cl = null;
  254. try {
  255. cl = (LinkedList<E>) super.clone();
  256. } catch (CloneNotSupportedException e) {
  257. Ks.ern("Blogai veikia ListKTU klasės protėvio metodas clone()");
  258. System.exit(1);
  259. }
  260. if (first == null) {
  261. return cl;
  262. }
  263. cl.first = new Node<>(this.first.element, null);
  264. Node<E> e2 = cl.first;
  265. for (Node<E> e1 = first.next; e1 != null; e1 = e1.next) {
  266. e2.next = new Node<>(e2.element, null);
  267. e2 = e2.next;
  268. e2.element = e1.element;
  269. }
  270. cl.last = e2.next;
  271. cl.size = this.size;
  272. return cl;
  273. }
  274. // !
  275.  
  276. /**
  277. * Formuojamas Object masyvas (E tipo masyvo negalima sukurti) ir surašomi
  278. * sąrašo elementai
  279. *
  280. * @return sąrašo elementų masyvas
  281. */
  282. public Object[] toArray() {
  283. Object[] a = new Object[size];
  284. int i = 0;
  285. for (Node<E> e1 = first; e1 != null; e1 = e1.next) {
  286. a[i++] = e1.element;
  287. }
  288. return a;
  289. }
  290.  
  291. /**
  292. * Masyvo rikiavimas Arrays klasės metodu sort
  293. */
  294. public void sortSystem() {
  295. Object[] a = this.toArray();
  296. Arrays.sort(a);
  297. int i = 0;
  298. for (Node<E> e1 = first; e1 != null; e1 = e1.next) {
  299. e1.element = (E) a[i++];
  300. }
  301. }
  302.  
  303. /**
  304. * Rikiavimas Arrays klasės metodu sort pagal komparatorių
  305. *
  306. * @param c komparatorius
  307. */
  308. public void sortSystem(Comparator<? super E> c) {
  309. Object[] a = this.toArray();
  310. Arrays.sort(a, (Comparator) c);
  311. int i = 0;
  312. for (Node<E> e1 = first; e1 != null; e1 = e1.next) {
  313. e1.element = (E) a[i++];
  314. }
  315. }
  316.  
  317. /**
  318. * Sąrašo rikiavimas burbuliuko metodu
  319. */
  320. public void sortBuble() {
  321. if (first == null) {
  322. return;
  323. }
  324. for (;;) {
  325. boolean jauGerai = true;
  326. Node<E> e1 = first;
  327. for (Node<E> e2 = first.next; e2 != null; e2 = e2.next) {
  328. if (e1.element.compareTo(e2.element) > 0) {
  329. E t = e1.element;
  330. e1.element = e2.element;
  331. e2.element = t;
  332. jauGerai = false;
  333. }
  334. e1 = e2;
  335. }
  336. if (jauGerai) {
  337. return;
  338. }
  339. }
  340. }
  341.  
  342. /**
  343. * Sąrašo rikiavimas burbuliuko metodu pagal komparatorių
  344. *
  345. * @param c komparatorius
  346. */
  347. public void sortBuble(Comparator<? super E> c) {
  348. if (first == null) {
  349. return;
  350. }
  351. for (;;) {
  352. boolean jauGerai = true;
  353. Node<E> e1 = first;
  354. for (Node<E> e2 = first.next; e2 != null; e2 = e2.next) {
  355. if (c.compare(e1.element, e2.element) > 0) {
  356. E t = e1.element;
  357. e1.element = e2.element;
  358. e2.element = t;
  359. jauGerai = false;
  360. }
  361. e1 = e2;
  362. }
  363. if (jauGerai) {
  364. return;
  365. }
  366. }
  367. }
  368.  
  369. /**
  370. * Sukuria iteratoriaus objektą sąrašo elementų peržiūrai
  371. *
  372. * @return iteratoriaus objektą
  373. */
  374. @Override
  375. public java.util.Iterator<E> iterator() {
  376. return new Iterator();
  377. }
  378.  
  379. /**
  380. * Iteratoriaus metodų klasė
  381. */
  382. class Iterator implements java.util.Iterator<E> {
  383.  
  384. private Node<E> iterPosition;
  385.  
  386. Iterator() {
  387. iterPosition = first;
  388. }
  389.  
  390. @Override
  391. public boolean hasNext() {
  392. return iterPosition != null;
  393. }
  394.  
  395. @Override
  396. public E next() {
  397. E d = iterPosition.element;
  398. iterPosition = iterPosition.next;
  399. return d;
  400. }
  401.  
  402. @Override
  403. public void remove() {
  404. throw new UnsupportedOperationException("Studentams reikia realizuoti remove()");
  405. }
  406. }
  407.  
  408. /**
  409. * Vidinė mazgo klasė
  410. *
  411. * @param <E> mazgo duomenų tipas
  412. */
  413. private static class Node<E> {
  414.  
  415. private E element; // ji nematoma už klasės ListKTU ribų
  416. private Node<E> next; // next - kaip įprasta - nuoroda į kitą mazgą
  417.  
  418. Node(E data, Node<E> next) { //mazgo konstruktorius
  419. this.element = data;
  420. this.next = next;
  421. }
  422.  
  423. /**
  424. * Suranda sąraše k-ąjį mazgą
  425. *
  426. * @param k ieškomo mazgo indeksas (prasideda nuo 0)
  427. * @return surastas mazgas
  428. */
  429. public Node<E> findNode(int k) {
  430. Node<E> e = this;
  431. for (int i = 0; i < k; i++) {
  432. e = e.next;
  433. }
  434. return e;
  435. }
  436. } // klasės Node pabaiga
  437. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement