Você está aqui: Python ::: Estruturas de Dados ::: Lista Ligada Simples |
Como inserir um novo nó na posição n de uma lista singularmente encadeada em PythonQuantidade de visualizações: 1080 vezes |
Depois de aprendermos a inserir nós no início e no final de uma lista singularmente ligada (singly linked list) em Python, chegou a hora de vermos o código que insere o nó em qualquer posição da lista. Este procedimento é um pouco mais complicado, e requer muita atenção para o seu perfeito entendimento. Note que temos agora um método inserir_posicao_n() que recebe o índice (começando em 0) da posição na qual queremos inserir o novo nó e a informação que estará contida no nó. No exemplo a seguir precisamos dos métodos inserir_inicio() e inserir_final() também. Isso faz sentido. Se o índice for 0 nós inserimos o novo nó no início, e se o índice for igual ao tamanho da lista nós inserimos no final. Caso contrário nós inserimos no meio da lista. Por "meio da lista" queremos dizer qualquer posição que não seja no início ou no fim da lista encadeada. 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(), inserir_inicio(), inserir_final(), inserir_posicao_n() 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 inserir um novo nó no final da lista def inserir_final(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: # obtemos uma referência ao nó inicial da lista no_atual = self.inicio # enquanto o próximo nó do nó atual não for nulo while no_atual.get_proximo() != None: # salta para o próximo nó no_atual = no_atual.get_proximo() # na saída do laço nós estamos no final da lista, # ou seja, no local adequada para a nova inserção no_atual.set_proximo(novo_no) # 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 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 inserir 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 inserir_posicao_n(self, pos, info): # posição inválida? if pos > self.get_tamanho() or pos < 0: print("\nPosição inválida\n") else: # índice 0 indica início da lista if pos == 0: self.inserir_inicio(info) else: # índice do tamanho da lista indica inserir no final if pos == self.get_tamanho(): self.inserir_final(info) else: # cria um novo nó contendo a informação e que # não aponta para nenhum outro nó novo_no = No(info, None) # ajusta o contador contador = 0 # apontamos para o início da lista no_atual = self.inicio # enquanto não encontrarmos a posição correta while contador < (pos - 1): # incrementa o contador contador = contador + 1 # saltamos para o próximo nó no_atual = no_atual.get_proximo() # já estamos na posição correta novo_no.set_proximo(no_atual.get_proximo()) no_atual.set_proximo(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 e no final da nossa lista singularmente encadeada e testa o método inserir_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("Insere o valor 12 no início da lista") lista.inserir_inicio(12) print("Conteúdo da lista: ") lista.exibir() print("Insere o valor 20 no final da lista") lista.inserir_final(20) print("Conteúdo da lista: ") lista.exibir() print("Insere o valor 87 no início da lista") lista.inserir_inicio(87) print("Conteúdo da lista: ") lista.exibir() print("Insere o valor 9 no final da lista") lista.inserir_final(9) print("Conteúdo da lista: ") lista.exibir() print("Insere o valor 50 no índice 2 da lista") lista.inserir_posicao_n(2, 50) print("Conteúdo da lista: ") lista.exibir() if __name__== "__main__": main() Ao executar este código Python nós teremos o seguinte resultado: c:\estudos_python>python estudos.py Insere o valor 12 no início da lista Conteúdo da lista: 12 Insere o valor 20 no final da lista Conteúdo da lista: 12 20 Insere o valor 87 no início da lista Conteúdo da lista: 87 12 20 Insere o valor 9 no final da lista Conteúdo da lista: 87 12 20 9 Insere o valor 50 no índice 2 da lista Conteúdo da lista: 87 12 50 20 9 |
![]() |
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 |