Você está aqui: Python ::: Estruturas de Dados ::: Lista Ligada Simples |
Como excluir um nó na posição n de uma lista singularmente encadeada em PythonQuantidade de visualizações: 1360 vezes |
Em dicas anteriores eu mostrei como remover nós no início e no final de uma lista ligada simples (simply linked list) na linguagem Python. Agora mostrarei o código que exclui um nó no meio da lista, ou seja, em uma posição n. Note que este código já é um pouco mais complexo e, da forma que o escrevi, as funções que removem no início e no final da lista ligada também deverão estar presentes. Estude a listagem com bastante atenção. Vamos começar então com o código para a classe No da lista singularmente ligada (que salvei em um arquivo no_lista_singularmente_ligada.py): # classe No para uma lista singularmente encadeada ou # ligada - Singly Linked List class No: # construtor da classe No def __init__(self, info, proximo): self.info = info self.proximo = proximo # método que permite definir o conteúdo do nó def set_info(self, info): self.info = info # método que permite obter a informação de um nó def get_info(self): return self.info # método que permite definir o campo próximo deste nó def set_proximo(self, proximo): self.proximo = proximo # método que permite obter o campo próximo deste nó def get_proximo(self): return self.proximo # retorna True se este nó apontar para outro nó def possui_proximo(self): return self.proximo != None Veja que o código para a classe Nó não possui muitas firulas. Temos apenas um campo info, que guardará o valor do nó, e um campo próximo, que aponta para o próximo nó da lista, ou null, se este for o único nó ou o último nó da lista ligada. Veja agora o código para a classe ListaLigadaSimples (lista_ligada_simples.py), com os métodos get_tamanho(), remover_posicao_n(), inserir_inicio(), remover_inicio(), remover_final() e exibir(): # importa a classe No from no_lista_singularmente_ligada import No # classe ListaLigadaSimples class ListaLigadaSimples: # construtor da classe def __init__(self): self.inicio = None # nó inicial da lista # método que permite retornar o tamanho da lista ligada, ou # seja, a quantidade de nós na lista encadeada simples def get_tamanho(self): # aponta para o início da lista no_atual = self.inicio # ajusta o contador em 0 contador = 0 # percorre todos os nós da lista ligada while no_atual != None: # incrementa o contador contador = contador + 1 # avança para o próximo nó da lista no_atual = no_atual.get_proximo() # retornamos a quantidade de nós return contador # método que permite excluir um novo nó no meio de uma lista ligada, # ou seja, em qualquer posição da lista encadeada ou, melhor ainda, # em uma posição n da lista def remover_posicao_n(self, pos): # a lista está vazia? if self.inicio is None: return None # posição inválida? if pos > (self.get_tamanho() - 1) or pos < 0: return None # se o índice for zero nós temos que remover no # início da lista if pos == 0: return self.remover_inicio() elif pos == (self.get_tamanho() - 1): # se o índice for igual ao último nó da lista return self.remover_final() else: # contador de nós contador = 0 # referencia o nó inicial da lista no_atual = self.inicio # referencia o nó anterior no_anterior = self.inicio # temp vai sempre guardar o próximo do nó atual temp = self.inicio # enquanto o nó atual for diferente de nulo while no_atual != None: # estamos na posição correta? if contador == pos: temp = no_atual.get_proximo() break no_anterior = no_atual no_atual = no_atual.get_proximo() contador = contador + 1 # o nó anterior aponta para o nó antes apontado # pelo nó atual no_anterior.set_proximo(temp) # retorna o nó removido return no_atual # método que deleta um nó no início de uma lista ligada # este método retorna o nó excluído def remover_inicio(self): # a lista está vazia? if self.inicio == None: return None else: # vamos excluir e retornar o primeiro nó da lista removido = self.inicio # a lista possui apenas um nó? if self.inicio.get_proximo() == None: # a lista agora ficará vazia self.inicio = None else: # o segundo nó passa a ser o início da lista self.inicio = self.inicio.get_proximo() # retorna o nó removido return removido # método que deleta um nó no final de uma lista ligada # este método retorna o nó excluído def remover_final(self): # a lista está vazia? if self.inicio == None: return None else: # vamos excluir e retornar o primeiro nó da lista removido = self.inicio # a lista possui apenas um nó? if self.inicio.get_proximo() == None: # a lista agora ficará vazia self.inicio = None else: # começamos apontando para o início da lista no_atual = self.inicio no_anterior = self.inicio # enquanto o próximo do nó atual for diferente de nulo while no_atual.get_proximo() != None: # avançamos o nó anterior no_anterior = no_atual # saltamos para o próximo nó no_atual = no_atual.get_proximo() # na estamos na posição de exclusão removido = no_atual no_anterior.set_proximo(None) # retorna o nó removido return removido # método que permite inserir um novo nó no início da lista def inserir_inicio(self, info): # cria um novo nó contendo a informação e que # não aponta para nenhum outro nó novo_no = No(info, None) # a lista ainda está vazia? if self.inicio == None: # o novo nó será o início da lista self.inicio = novo_no else: # o novo nó aponta para o início da lista novo_no.set_proximo(self.inicio) # o novo nó passa a ser o início da lista self.inicio = novo_no # método que permite exibir todos os nós da lista # ligada simples (lista singularmente encadeada) def exibir(self): # aponta para o início da lista no_atual = self.inicio # enquanto o nó não for nulo while no_atual != None: # exibe o conteúdo do nó atual print(no_atual.get_info()) # pula para o próximo nó no_atual = no_atual.get_proximo() E agora o código main() que insere alguns valores no início da nossa lista singularmente encadeada e testa o método remover_posicao_n(): # importa a classe ListaLigadaSimples from lista_singularmente_ligada import ListaLigadaSimples # método principal def main(): # cria uma nova lista encadeada simples lista = ListaLigadaSimples() print("Vamos inserir varios valores na lista, sempre no início") lista.inserir_inicio(12) lista.inserir_inicio(30) lista.inserir_inicio(27) lista.inserir_inicio(84) lista.inserir_inicio(9) print("Conteúdo da lista: ") lista.exibir() print("Agora vamos excluir o nó no índice 2") removido = lista.remover_posicao_n(2) if removido == None: print("Lista vazia ou posição inválida") else: print("Nó removido:", removido.get_info()) print("Conteúdo da lista: ") lista.exibir() if __name__== "__main__": main() Ao executar este código Python nós teremos o seguinte resultado: Vamos inserir varios valores na lista, sempre no início Conteúdo da lista: 9 84 27 30 12 Agora vamos excluir o nó no índice 2 Nó removido: 27 Conteúdo da lista: 9 84 30 12 |
![]() |
Desafios, Exercícios e Algoritmos Resolvidos de Python |
Veja mais Dicas e truques de Python |
Dicas e truques de outras linguagens |
E-Books em PDF |
||||
|
||||
|
||||
Linguagens Mais Populares |
||||
1º lugar: Java |