Advertisement
Guest User

Untitled

a guest
Nov 18th, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.47 KB | None | 0 0
  1. package pt.ipleiria.estg.dei.aed.colecoes.iteraveis.lineares.naoordenadas.estruturas;
  2.  
  3. import pt.ipleiria.estg.dei.aed.colecoes.iteraveis.IteradorIteravel;
  4. import pt.ipleiria.estg.dei.aed.colecoes.iteraveis.IteradorIteravelDuplo;
  5. import pt.ipleiria.estg.dei.aed.colecoes.iteraveis.lineares.naoordenadas.ColecaoIteravelLinearNaoOrdenada;
  6.  
  7. import java.util.NoSuchElementException;
  8.  
  9. public class ListaDuplaNaoOrdenada<T> implements ColecaoIteravelLinearNaoOrdenada<T> {
  10.  
  11. protected No noInicial;
  12. protected No noFinal;
  13. protected int numeroElementos;
  14.  
  15. //ListaDuplaNaoOrdenada listaDNO = new ListaDuplaNaoOrdenada<>();
  16.  
  17. @Override
  18. public void inserirNoInicio(T elem) {
  19. if (++numeroElementos == 1){ //CASO 1 inicialmente a lista esta vazia numeroElementos = 0
  20. noInicial = noFinal = new No(elem);
  21. }
  22. else {
  23. noInicial = new No(elem, true);
  24. }
  25.  
  26. }
  27.  
  28. @Override
  29. public void inserirNoFim(T elem) {
  30. noFinal = new No(elem);
  31. if (++numeroElementos == 1){ //CASO 1 inicialmente a lista esta vazia numeroElementos = 0
  32. noInicial = noFinal;
  33. }
  34. }
  35.  
  36. @Override
  37. public void inserir(int indice, T elem) {
  38. if (numeroElementos == 0){
  39. inserirNoInicio(elem);
  40. }
  41.  
  42. if (indice == 0){
  43. inserirNoInicio(elem);
  44. } else if (indice == numeroElementos){
  45. inserirNoFim(elem);
  46. } else {
  47. new No(elem, getNo(indice));
  48. numeroElementos++;
  49. }
  50.  
  51. }
  52.  
  53. private No getNo(int indice) {
  54. if (indice < 0 || indice > numeroElementos - 1){
  55. throw new IndexOutOfBoundsException("Índice inválido");
  56. }
  57.  
  58. No cor = noInicial;
  59. if (indice < numeroElementos / 2){
  60. cor = noInicial;
  61. while (indice-- > 0){
  62. cor = cor.seguinte;
  63. }
  64. } else {
  65. cor = noFinal;
  66. while (++indice < numeroElementos){
  67. cor = cor.anterior;
  68. }
  69. }
  70. return cor;
  71. }
  72.  
  73. @Override
  74. public T removerDoInicio() {
  75. if (numeroElementos == 0){
  76. return null;
  77. }
  78.  
  79. No aux = noInicial;
  80. noInicial = noInicial.seguinte;
  81. if (--numeroElementos == 1){
  82. noFinal = null;
  83. } else {
  84. noInicial.anterior = null;
  85. }
  86. return aux.elemento;
  87. }
  88.  
  89.  
  90. //ACHO QUE NAO ESTA BEM---FALTA COPIAR O DO STOR
  91. @Override
  92. public T removerDoFim() {
  93. if (numeroElementos == 0){
  94. return null;
  95. }
  96. No aux = noFinal;
  97. noFinal = noFinal.anterior;
  98. if (--numeroElementos == 0){
  99. noFinal = null;
  100. } else {
  101. noFinal.seguinte = null;
  102. }
  103. return aux.elemento;
  104. }
  105.  
  106. @Override
  107. public T remover(T elem) {
  108. if (numeroElementos == 0){
  109. return null;
  110. }
  111.  
  112. if (noInicial.elemento.equals(elem)){
  113. return removerDoInicio();
  114. }
  115.  
  116. if (noFinal.elemento.equals(elem)){
  117. return removerDoFim();
  118. }
  119.  
  120. No no = getNo(elem);
  121. return no != null ? remover(no) : null;
  122. }
  123.  
  124. //Devolve no com elem ou null caso contrário
  125. private No getNo(T elem) {
  126. No no = noInicial;
  127. while (no != null && !no.elemento.equals(elem)){
  128. no = no.seguinte;
  129. }
  130. return no;
  131. }
  132.  
  133. @Override
  134. public T remover(int indice) {
  135. if (numeroElementos == 0){
  136. return null;
  137. }
  138.  
  139. if (indice == 0){
  140. return removerDoInicio();
  141. }
  142.  
  143. if (indice == numeroElementos-1){
  144. return removerDoFim();
  145. }
  146.  
  147. return remover(getNo(indice));
  148. }
  149.  
  150. public T remover(No no) {
  151. no.anterior.seguinte = no.seguinte;
  152. no.seguinte.anterior = no.anterior;
  153. numeroElementos--;
  154.  
  155. return no.elemento;
  156. }
  157.  
  158. @Override
  159. public T removerPorReferencia(T elem) {
  160. if (numeroElementos == 0){
  161. return null;
  162. }
  163.  
  164. if (noInicial.elemento == elem){
  165. return removerDoInicio();
  166. }
  167.  
  168. if (noFinal.elemento == elem){
  169. return removerDoFim();
  170. }
  171.  
  172. No no = getNoPorReferencia(elem);
  173. return no != null ? remover(no) : null;
  174. }
  175.  
  176. private No getNoPorReferencia(T elem) {
  177. No no = noInicial;
  178. while (no != null && no.elemento != elem){
  179. no = no.seguinte;
  180. }
  181. return no;
  182. }
  183.  
  184. @Override
  185. public T consultar(int indice) {
  186. return getNo(indice).elemento;
  187. }
  188.  
  189. @Override
  190. public boolean contem(T elem) {
  191. return getNo(elem) != null;
  192. }
  193.  
  194. @Override
  195. public boolean contemReferencia(T elem) {
  196. return false;
  197. }
  198.  
  199. @Override
  200. public IteradorIteravelDuplo<T> iterador() {
  201. return new Iterador();
  202. }
  203.  
  204. @Override
  205. public int getNumeroElementos() {
  206. return 0;
  207. }
  208.  
  209. protected class No{
  210. protected T elemento;
  211. protected No seguinte;
  212. protected No anterior;
  213.  
  214. //Criacao de nó com elem e colocacao no final
  215. protected No(T elem) {
  216. elemento = elem;
  217. seguinte = null;
  218. anterior = noFinal;
  219. if (noFinal != null){
  220. noFinal.seguinte = this;
  221. }
  222. }
  223.  
  224. //Criacao de nó com elem e colocacao no inicio (nao null)
  225. protected No(T elem, boolean estupido) {
  226. elemento = elem;
  227. seguinte = noInicial;
  228. anterior = null;
  229. noInicial.anterior = this;
  230. }
  231.  
  232. //Criação de nó com elem e colocação antes de seg
  233. public No(T elem, No seg){
  234. elemento = elem;
  235. seguinte = seg;
  236. anterior = seg.anterior;
  237. seguinte.anterior = anterior.seguinte = this;
  238. }
  239. }
  240.  
  241. protected class Iterador implements IteradorIteravelDuplo<T> {
  242.  
  243. protected No anterior;
  244. protected No corrente;
  245. protected No proximo;
  246.  
  247. public Iterador() {
  248. anterior = noFinal;
  249. corrente = null;
  250. proximo = noInicial;
  251. }
  252.  
  253. @Override
  254. public void reiniciar() {
  255.  
  256. }
  257.  
  258. @Override
  259. public T corrente() {
  260. if (corrente == null){
  261. throw new NoSuchElementException("Elemento inválido");
  262. }
  263. return corrente.elemento;
  264. }
  265.  
  266. @Override
  267. public boolean podeAvancar() {
  268. return proximo != null;
  269. }
  270.  
  271. @Override
  272. public T avancar() {
  273. if (!podeAvancar()){
  274. throw new NoSuchElementException("Elemento Inválido");
  275. }
  276. anterior = corrente;
  277. corrente = proximo;
  278. proximo = proximo;
  279. return corrente.elemento;
  280. }
  281.  
  282. @Override
  283. public boolean podeRecuar() {
  284. return anterior != null;
  285. }
  286.  
  287. @Override
  288. public T recuar() {
  289.  
  290. if (!podeRecuar()){
  291. throw new NoSuchElementException("Elemento Inválido");
  292. }
  293.  
  294. proximo = corrente;
  295. corrente = anterior;
  296. anterior = anterior.anterior;
  297. return corrente.elemento;
  298. }
  299. }
  300. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement