Você está aqui: Python ::: Estruturas de Dados ::: Lista Ligada Simples

Como excluir um nó na posição n de uma lista singularmente encadeada em Python

Quantidade 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

Link para compartilhar na Internet ou com seus amigos:

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

E-Book 350 Exercícios Resolvidos de Java - PDF com 500 páginas
Domine lógica de programação e a linguagem Java com o nosso E-Book 350 Exercícios Exercícios de Java, para você estudar onde e quando quiser.

Este e-book contém exercícios resolvidos abrangendo os tópicos: Java básico, matemática e estatística, programação dinâmica, strings e caracteres, entrada e saída, estruturas condicionais, vetores e matrizes, funções, laços, recursividade, internet, arquivos e diretórios, programação orientada a objetos e muito mais.
Ver Conteúdo do E-book
E-Book 650 Dicas, Truques e Exercícios Resolvidos de Python - PDF com 1.200 páginas
Domine lógica de programação e a linguagem Python com o nosso E-Book 650 Dicas, Truques e Exercícios Exercícios de Python, para você estudar onde e quando quiser.

Este e-book contém dicas, truques e exercícios resolvidos abrangendo os tópicos: Python básico, matemática e estatística, banco de dados, programação dinâmica, strings e caracteres, entrada e saída, estruturas condicionais, vetores e matrizes, funções, laços, recursividade, internet, arquivos e diretórios, programação orientada a objetos e muito mais.
Ver Conteúdo do E-book

Linguagens Mais Populares

1º lugar: Java
2º lugar: Python
3º lugar: C#
4º lugar: PHP
5º lugar: C
6º lugar: Delphi
7º lugar: JavaScript
8º lugar: C++
9º lugar: VB.NET
10º lugar: Ruby



© 2025 Arquivo de Códigos - Todos os direitos reservados
Neste momento há 28 usuários muito felizes estudando em nosso site.