A lista duplamente encadeada funciona pelo mesmo princípio que a lista encadeada. No entanto, cada nó contém uma referência ao nó anterior e ao próximo, se esse nó estiver disponível. Isso é particularmente útil quando é necessário viajar para trás e para frente.
Nossa lista Duplamente Encadeada será o desafio final e o mais longo com 9 métodos adicionais:
DisplayAllBackwards() DisplayAt(index), AddFirst(data),AddLast(data), Add(data, index), RemoveFirst(), RemoveFirst(), RemoveAt().
DisplayAll():
Descrição:
Retorna um array com os dados, ou se está vazio, retorna null.
this.DisplayAll = function() {
// Na maioria das vezes, head não será nulo, então vamos começar com isso agora
if (head) {
let arr = new Array();
let atual = head;
for (let i = 0; i < contador; i++) {
arr[i] = atual.dado;
atual = atual.proximo;
}
return arr;
} else {
return null;
}
}
DisplayAllBackwards():
Descrição:
Retorna um array com os dados do tail ao head ou, se vazio, retorna nulo. Dê uma olhada neste método e pense em como seria difícil implementá-lo em uma lista encadeada simples.
this.DisplayAllBackwards = function() {
if (head) {
let arr = new Array();
let atual = tail;
for (let i = 0; i < contador; i++) {
arr[i] = atual.dado;
atual = atual.anterior;
}
return arr;
} else {
return null;
}
}
DisplayAt():
Descrição:
Funciona da mesma forma de uma lista encadeada simples.
this.DisplayAt = function(index) {
// verifica valores fora dos limites
if (index > -1 && index < contador) {
let atual = head;
let i = 0;
// não fui eu, é da nczonline (veja fonte).
// É uma maneira diferente de implementar o FOR que estamos usando
// e queria que todos tivessem a chance de conhecê-lo.
while (i++ < index) {
atual = atual.proximo;
}
return atual.dado;
} else {
return null;
}
}
AddFirst():
Descrição:
Adiciona no início da lista duplamente encadeada.
this.AddFirst = function(dado) {
// Cria um novo nó
let node = new Node(dado);
node.proximo = head;
head = node;
//Se a lista está vazia
if (contador === 0) {
tail = head;
} else {
//Não se esqueça do nó anterior. Ele precisa ser referenciado
head.proximo.anterior = head;
}
contador++;
}
AddLast():
Descrição:
Adiciona ao final da lista duplamente encadeada.
this.AddLast = function(dado) {
let node = new Node(dado);
node.anterior = tail;
if (contador === 0) {
head = node;
} else {
tail.proximo = node;
}
tail = node;
contador++;
}
Add():
Descrição:
Adiciona um item em uma posição específica. Dica: desenhe o processo se necessário. Não é tão simples quanto você imagina.
this.Add = function(dado, index) {
// verifica valores fora dos limites
if (index > 0 && index < contador) {
let node = new Node(dado);
let atual = head;
let i = 0;
// encontre o local certo
while (i++ < index) {
atual = atual.proximo;
}
atual.anterior.proximo = node;
node.proximo = atual;
node.anterior = atual.anterior;
atual.anterior = node;
contador++;
} else if (index < 1) {
this.AddFirst(dado);
} else {
this.AddLast(dado);
}
}
RemoveFirst():
Descrição:
Remove o primeiro item.
this.RemoveFirst = function() {
if (head) {
head = head.proximo;
contador--;
//Se há apenas um item
if (contador === 0) {
tail = null;
} else {
// Não se esqueça do nó anterior. Ele também precisa que o conjunto de referência seja nulo.
head.anterior = null;
}
}
}
RemoveLast():
Descrição:
Remove o último item.
this.RemoveLast = function() {
if (head) {
// existe apenas um item
if (contador === 1) {
head = null;
tail = null;
} else {
tail.anterior.proximo = null;
tail = tail.anterior;
}
contador--;
}
}
RemoveAt():
Descrição:
Remove um item de uma posição específica.
this.RemoveAt = function(index) {
// verifica valores fora dos limites
if (index > 0 && index < contador - 1) {
let atual = head;
let i = 0;
// encontre o local certo
while (i++ < index) {
atual = atual.proximo;
}
atual.anterior.proximo = atual.proximo;
atual.proximo.anterior = atual.anterior;
contador--;
} else if (index < 1) {
this.RemoveFirst();
} else {
this.RemoveLast();
}
}
- DISPLAYALL():
- DISPLAYALLBACKWARDS():
- DISPLAYAT(INDICE):
- ADDFIRST(DADO):
- ADDLAST(DADO):
- ADD(DADO,INDICE):
- REMOVEFIRST():
- REMOVELAST():
- REMOVEAT(INDICE):