#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Thu Jun  3 15:14:06 2021

@author: ojacques
"""
import numpy as np

class NodoLista:
    """Esta classe representa um nodo de uma lista encadeada."""
    def __init__(self, dado=0, proximo_nodo=None):
        self.dado = dado
        self.proximo = proximo_nodo

    def __repr__(self):
        return '%s -> %s' % (self.dado, self.proximo)
    
    # def __del__(self):
    #     print("Nodos destruídos")

class ListaEncadeada:
    """Esta classe representa uma lista encadeada."""

    def __init__(self): 
        self.cabeca = None
        self.tamanho = 0

    # def __del__(self):
    #    print("Objetos destruídos")
        
    
    def __repr__(self):
        return "[" + str(self.cabeca) + "]"


    def insere_no_inicio(self, novo_dado):
        """Insere um elemento no começo da lista."""
        
        # Cria um novo nodo com o dado a ser armazenado.
        novo_nodo = NodoLista(novo_dado)
        
        # Faz com que o novo nodo seja a cabeça da lista.
        novo_nodo.proximo = self.cabeca
        
        # Faz com que a cabeça da lista referencie o novo nodo.
        self.cabeca = novo_nodo
        self.tamanho += 1

    def insere_depois(self, nodo_anterior, novo_dado):
        """Insere um elemento após outro elemento na lista."""
        
        assert nodo_anterior, "Nodo anterior precisa existir na lista."
        
        # Cria um novo nodo com o dado desejado.
        novo_nodo = NodoLista(novo_dado)
        
        # Faz o próximo do novo nodo ser o próximo do nodo anterior.
        novo_nodo.proximo = nodo_anterior.proximo
        
        # Faz com que o novo nodo seja o próximo do nodo anterior.
        nodo_anterior.proximo = novo_nodo
        self.tamanho += 1
    
    def remove(self, valor):
        """Remove um elemento da lista."""
        
        assert self.cabeca, "Impossível remover valor de lista vazia."
        
        # Nodo a ser removido é a cabeça da lista.
        if self.cabeca.dado == valor:
            self.cabeca = self.cabeca.proximo
        else:
            # Encontra a posição do elemento a ser removido.
            anterior = None
            corrente = self.cabeca
            while corrente and corrente.dado != valor:
                anterior = corrente
                corrente = corrente.proximo            
            
            # O nodo corrente é o nodo a ser removido.
            if corrente:                
                anterior.proximo = corrente.proximo
            else:
                # O nodo corrente é a cauda da lista.
                anterior.proximo = None
        self.tamanho -= 1
                
    def busca(self, valor):
        """Procura por um elemento na lista."""

        corrente = self.cabeca
        while corrente and corrente.dado != valor:
            corrente = corrente.proximo
        return corrente
    
numeros=np.array([803, 825, 237, 365, 967, 173, 736, 725, 937, 724])

lista = ListaEncadeada()
for num in numeros:
    lista.insere_no_inicio(num)
    
outraLista=ListaEncadeada()
for num in numeros:
    if outraLista.tamanho:         #se não é vazio
        outraLista.insere_depois(anterior,num)
        anterior = anterior.proximo
    else:
        outraLista.insere_no_inicio(num)
        anterior=outraLista.cabeca

        