Advertisement
Guest User

Untitled

a guest
Feb 20th, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.20 KB | None | 0 0
  1. package List;
  2.  
  3.  
  4. import java.lang.reflect.Array;
  5. import java.util.*;
  6.  
  7.  
  8. public class HybridList<E> {
  9. Class<E> type;
  10. private final int MAX_SIZE = 100_000;
  11. private int size;
  12. private Node<E> firstnode; //Pointer to firstnode node.
  13. private Node<E> lastnode; //Pointer to lastnode node.
  14.  
  15. //Constructor empty list
  16. public HybridList(Class<E> type) {
  17. this.type = type;
  18. }
  19.  
  20. //Check is List empty
  21. public boolean isEmpty(){
  22. return firstnode == null && lastnode == null;
  23. }
  24.  
  25. //Return size of list
  26. public int getSize() {
  27. return size;
  28. }
  29.  
  30. //Add element to the beginning
  31. public boolean addFirst(E element) {
  32.  
  33. if (!contain(element) && checkSize()) {
  34. linkFirst(element);
  35. return true;
  36. }
  37. else
  38. return false;
  39. }
  40.  
  41. //Add element in the end
  42. public boolean addLast(E element) {
  43. if (!contain(element) && checkSize()) {
  44. linkLast(element);
  45. return true;
  46. }
  47. else
  48. return false;
  49. }
  50.  
  51. //Return element from the beginning
  52. public E getLastElement(){
  53. checkElementIndex(size-1);
  54. return node(size-1).item;
  55.  
  56. }
  57.  
  58. //Return element from the end
  59. public E getFirstElement(){
  60. checkElementIndex(0);
  61. return node(0).item;
  62. }
  63.  
  64. //Replace old element by new element
  65. public boolean changeValueofElement(E oldelement, E newelement){
  66. if (!contain(newelement)) {
  67. Node<E> x = firstnode;
  68. for (int i = 0; i < size; i++) {
  69. if (x.item.equals(oldelement)) {
  70. x.item = newelement;
  71. return true;
  72. }
  73. x = x.next;
  74. }
  75. }
  76. return false;
  77. }
  78.  
  79. //Set new element by index
  80. public boolean changeValuebyIndex(int index, E newelement){
  81. checkElementIndex(index);
  82. return changeValueofElement(newelement,node(index).item);
  83. }
  84.  
  85. //Check is this value exist in the List
  86. public boolean contain(E element){
  87. Node<E> x = firstnode; //идем сначала
  88. for (int i = 0; i < size; i++) {
  89. if ( x.item != null && x.item.equals(element) )
  90. return true;
  91. x = x.next;
  92. }
  93. return false;
  94. }
  95.  
  96. //Delete element from the beginning
  97. public E removeFirst() {
  98. final Node<E> f = firstnode;
  99. if (f == null) //Есть ли ссылка на первый узел
  100. throw new NullPointerException();
  101. return removelinkFirst(f);
  102. }
  103.  
  104. //Delete element from the end
  105. public E removeLast() {
  106. final Node<E> f = lastnode;
  107. if (f == null) //Есть ли ссылка на последний узел
  108. throw new NullPointerException();
  109. return removelinkLast(f);
  110. }
  111.  
  112. //Add element to the end
  113. public E add(E element){
  114. addLast(element);
  115. return element;
  116. }
  117.  
  118. //Add element by index
  119. public boolean add(int index, E element){
  120. if( !contain(element)){
  121. if (index == size)
  122. linkLast(element);
  123. else {
  124. checkElementIndex(index);
  125. linkBefore(element, node(index));
  126. }
  127. }
  128. return false;
  129. }
  130.  
  131. //Get element by index
  132. public E get(int index) {
  133. checkElementIndex(index);
  134. Node<E> x = firstnode;
  135. for (int i = 0; i <= index; i++) {
  136. if(i==index)
  137. return x.item;
  138. x=x.next;
  139. }
  140. return null;
  141. }
  142.  
  143. //Delete element from the end
  144. public E remove(){
  145. return removeLast();
  146. }
  147.  
  148. //Delete element by index
  149. public E remove(int index){
  150. checkElementIndex(index);
  151. return removeLinks(node(index));
  152. }
  153.  
  154.  
  155. public E[] toArray(){
  156. @SuppressWarnings("unchecked")
  157. E[] a = (E[]) Array.newInstance(type, this.size);
  158. Node<E> x = firstnode;
  159. for (int i = 0; i < size; i++) {
  160. a[i] = x.item;
  161. x=x.next;
  162. }
  163. return a;
  164. }
  165.  
  166. //Return TreeSet with all elements
  167. public TreeSet<E> toTreeSet(){
  168. TreeSet<E> set = new TreeSet<>();
  169. for (Node<E> x = firstnode; x != null; x = x.next){
  170. set.add(x.item);
  171. }
  172. return set;
  173. }
  174. //Return ArrayList with all elements
  175. public ArrayList<E> toArrayList(){
  176. ArrayList<E> arrayList = new ArrayList<>();
  177. for (Node<E> x = firstnode; x != null; x = x.next){
  178. arrayList.add(x.item);
  179. }
  180. return arrayList;
  181. }
  182.  
  183. @Override
  184. public String toString() {
  185. StringBuilder sb = new StringBuilder();
  186. sb.append("[ ");
  187. Node<E> x = firstnode;
  188. for (int i = 0; i < size; i++) {
  189. sb.append(x.item+" ");
  190. x = x.next;
  191. }
  192. sb.append("]");
  193. return String.valueOf(sb);
  194. }
  195. // Class contains nodes with items
  196. private static class Node<E> {
  197. E item;
  198. Node<E> next;
  199. Node<E> last;
  200. Node(Node<E> last, E element, Node<E> next) {
  201. this.item = element;
  202. this.next = next;
  203. this.last = last;
  204. }
  205. }
  206. private boolean checkSize(){
  207. return size <= MAX_SIZE;
  208. }
  209. private E removeLinks(Node<E> x) {
  210. // assert x != null;
  211. final E element = x.item; //our object
  212. final Node<E> next1 = x.next; //link for obj after x
  213. final Node<E> last1 = x.last; //link for obj before x
  214. if (last1 == null) { //obj is first
  215. firstnode = next1;
  216. } else {
  217. last1.next = next1;
  218. x.last = null;
  219. }
  220. if (next1 == null) { //obj is last
  221. lastnode = last1;
  222. } else {
  223. next1.last = last1;
  224. x.next = null;
  225. }
  226. x.item = null;
  227. size--;
  228. return element;
  229. }
  230. private void linkBefore(E element, Node<E> succ) { //Передали сам новый элемент и узел с нужным индексом
  231. // assert succ != null;
  232. final Node<E> pred = succ.last; //Узел = ссылка на предыдущий элемент
  233. final Node<E> newNode = new Node<>(pred, element, succ);
  234. succ.last = newNode; //Этот элемент с нужным индксом как-бы сдвигается вперед(ссылается на предыдущий новый)
  235. if (pred == null) //Иф по индексу 0
  236. firstnode = newNode; //Становится первым элементом
  237. else
  238. pred.next = newNode; //Предыдущий теперь ссылается на новый
  239. size++;
  240. }
  241. private void linkFirst(E elment) {
  242. final Node<E> f = firstnode; //узел = ссылка на предыдущий 1й существующий узел
  243. final Node<E> newNode = new Node<>(null, elment, f); //create new node,when el add
  244. firstnode = newNode; //Ссылка на первый узел равно новому узлу(т.е новому єлементу)
  245. if (f == null) //Иф первые елемента не было
  246. lastnode = newNode; //Ссылка на последний узел
  247. else
  248. f.last = newNode; //иф был то ссылка на последний элемент = сущ
  249. size++;
  250. }
  251. private void linkLast(E elment) {
  252. final Node<E> l = lastnode; //узел = ссылка на предыдущий последний существующий узел
  253. final Node<E> newNode = new Node<>(l, elment, null);
  254. lastnode = newNode;
  255. if (l == null)
  256. firstnode = newNode;
  257. else
  258. l.next = newNode;
  259. size++;
  260. }
  261. private Node<E> node(int index) { //возврат узла по индексу ??
  262. // assert isElementIndex(index);
  263. if (index < size/2 ) { //insert not in the 2nd part of list
  264. Node<E> x = firstnode; //идем сначала
  265. for (int i = 0; i < index; i++)
  266. x = x.next; //доходим методом перебора
  267. return x;
  268. } else { //индекс
  269. Node<E> x = lastnode; //идем с конца
  270. for (int i = size - 1; i > index; i--)
  271. x = x.last;
  272. return x;
  273. }
  274. }
  275. private boolean isElementIndex(int index) {
  276. return index >= 0 && index < size;
  277. }
  278. private void checkElementIndex(int index) {
  279. if (!isElementIndex(index))
  280. throw new IndexOutOfBoundsException();
  281. }
  282. private E removelinkFirst(Node<E> f) { //узел
  283. // assert f == first && f != null;
  284. final E element = f.item; //считка значения для возврата
  285. final Node<E> next = f.next; //узел хранящий ссылку на следущий элемент, кот станет первым
  286. f.item = null; // уничтожение значения узла
  287. f.next = null; //Уничтожение ссылки на следующий елемент(на предыдущий и так null)
  288. firstnode = next; //Ссылка на первый элемент теперь на след елементе
  289. if (next == null) //Элемент один был
  290. lastnode = null; //ссылки на последний элемент не будет
  291. else
  292. next.last = null; //Ставший первым элемент не имеет ссылки на предыдущий
  293. size--;
  294. return element;
  295. }
  296. private E removelinkLast(Node<E> f) { //узел
  297. // assert f == first && f != null;
  298. final E element = f.item; //считка значения для возврата
  299. final Node<E> last = f.last; //узел хранящий ссылку на следущий элемент, кот станет последним
  300. f.item = null; // уничтожение значения узла
  301. f.last = null; //Уничтожение ссылки на предыдущий елемент(на след и так null)
  302. lastnode = last; //Ссылка на последний элемент теперь на предыдущем элементе
  303. if (last == null) //Элемент один был
  304. firstnode = null; //ссылки на последний элемент не будет
  305. else
  306. last.next = null; //Ставший последним элемент не имеет ссылки на след
  307. size--;
  308. return element;
  309. }
  310. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement