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: 1249 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 |
|
Java - Estruturas de Dados em Java - Como inserir nós no final de uma lista singularmente ligada em Java |
E-Books em PDF |
||||
|
||||
|
||||
Linguagens Mais Populares |
||||
|
1º lugar: Java |





