6 minutos de Leitura 🕒
Uma lista duplamente encadeada é um tipo de lista encadeada onde suas células são encadeadas em ambos os sentidos. Esse tipo de lista suporta de forma eficiente a navegabilidade reversa (ex. da direita para a esquerda), bem como a inserção e remoção de elementos antecessores a um outro na lista.
l.celulas[]
: células que armazenam os elementos da lista duplamente encadeada.l.primeiro
: um ponteiro que referencia o primeiro elemento da lista duplamente encadeada.l.ultimo
: um ponteiro que referencia o último elemento da lista duplamente encadeada.l.comprimento
: um inteiro que conta o número de elementos na lista duplamente encadeada.comprimento()
retorna o número de elementos em uma lista duplamente encadeada.primeiro()
inspeciona o primeiro elemento de uma lista duplamente encadeada.ultimo()
inspeciona o último elemento de uma lista duplamente encadeada.inserir-sucessor()
insere um elemento como sucessor de outro em uma lista duplamente encadeada.remover-sucessor()
remove o sucessor de um elemento em uma lista duplamente encadeada.inserir-antecessor()
insere um elemento como antecessor de outro em uma lista duplamente encadeada.remover-antecessor()
remove o antecessor de um elemento em uma lista duplamente encadeada.l.comprimento
.comprimento(l: Lista)
RETORNE l.comprimento
l
está vazia. Em caso afirmativo, vá para o passo 2. Caso contrário, vá para o passo 3."lista vazia"
.l.primeiro
.primeiro(l: Lista)
SE l está vazia
RETORNE "lista vazia"
SENÃO
RETORNE l.celulas[l.primeiro]
l
está vazia. Em caso afirmativo, vá para o passo 2. Caso contrário, vá para o passo 3."lista vazia"
.l.ultimo
.ultimo(l: Lista)
SE l está vazia
RETORNE "lista vazia"
SENÃO
RETORNE l.celulas[l.ultimo]
q
na lista l
.e
na célula q
.p
como o sucessor de q
.p
como antecessor de q
.q
como o o antecessor do sucessor de p
q
como o sucessor de p
.l.comprimento
.q
é a última célula da lista l
, atualize l.ultimo
para referenciar q
.inserir-sucessor(l: Lista, p: Célula, e: Elemento)
q = referência para nova célula
l.celulas[q] = e
q.sucessor = p.sucessor
q.antecessor = p
p.sucessor.antecessor = q
p.sucessor = q
l.comprimento = l.comprimento + 1
SE q é a última célula de l
l.ultimo = q
l
está vazia. Em caso afirmativo, vá para o passo 2. Caso contrário, vá para o passo 3."lista vazia"
.q
uma referência para o sucessor de p
.e
o elemento armazenado em q
.p
como o antecessor do sucessor de q
.q
como sucessor de p
.l.comprimento
.p
é a última célula da lista l
, atualize l.ultimo
para referenciar p
.e
.remover-sucessor(l: Lista, p: Célula)
SE l está vazia
RETORNE "lista vazia"
SENÃO
q = p.sucessor
e = l.celulas[q]
q.sucessor.antecessor = p
p.sucessor = q.sucessor
l.comprimento = l.comprimento - 1
SE p é a última célula de l
l.ultimo = p
RETORNE e
q
na lista l
.e
na célula q
.p
como o sucessor de q
.p
como antecessor de q
.q
como sucessor do antecessor de p
.q
como antecessor de p
.l.comprimento
.q
é a primeira célula da lista l
, atualize l.primeiro
para referenciar q
.inserir-antecessor(l: Lista, p: Célula, e: Elemento)
q = referência para nova célula
l.celulas[q] = e
q.sucessor = p
q.antecessor = p.antecessor
p.antecessor.sucessor = q
p.antecessor = q
l.comprimento = l.comprimento + 1
SE q é a primeira célula de l
l.primeiro = q
l
está vazia. Em caso afirmativo, vá para o passo 2. Caso contrário, vá para o passo 3."lista vazia"
.q
uma referência para o antecessor de p
.e
o elemento armazenado em q
.p
como sucessor do antecessor de q
.q
como antecessor de p
.l.comprimento
.p
é a primeira célula da lista l
, atualize l.primeiro
para referenciar p
.e
.remover-antecessor(l: Lista, p: Célula)
SE l está vazia
RETORNE "lista vazia"
SENÃO
q = p.sucessor
e = l.celulas[q]
q.antecessor.sucessor = p
p.antecessor = q.antecessor
l.comprimento = l.comprimento - 1
SE p é a primeira célula de l
l.ultimo = p
RETORNE e