Skip to content
Snippets Groups Projects
lista.py 2.94 KiB
Newer Older
Jonas Rocha's avatar
Jonas Rocha committed
class NodoLista:
    """Esta classe representa um nodo de uma lista encadeada."""
    def __init__(self, dado=0, proximo_nodo=None, anterior_nodo = None):
        self.dado = dado
        self.proximo = proximo_nodo
        self.anterior = anterior_nodo


class ListaEncadeada():
    """Esta classe representa uma lista encadeada."""
    def __init__(self): 
        self.cabeca = None

    def __repr__(self):
        return "[" + str(self.cabeca) + "]"

    def print_lista(self):
        corrente = self.cabeca
        print("[ " , end="")
        while corrente.proximo != None:
            print( str(corrente.dado), "-> <- ", end="")
            corrente = corrente.proximo
        print(corrente.dado,"]\n")



def insere_no_inicio(lista, novo_dado):
   
    if lista.cabeca == None:
        novo_nodo = NodoLista(novo_dado)
        novo_nodo.proximo = None
        novo_nodo.anterior = None
        lista.cabeca = novo_nodo
    else:
        novo_nodo = NodoLista(novo_dado)
        first = lista.cabeca
        novo_nodo.proximo = first
        novo_nodo.anterior = None
        first.anterior = novo_nodo
        lista.cabeca = novo_nodo


def swap(lista, valor1, valor2):
    a = busca(lista,valor1)
    b = busca(lista,valor2)

    if id(a) < id(b):
        temp = a
        a = b
        b = temp

    if a.anterior == None and a.proximo == b:   #juntos no comeco
        lista.cabeca = b
        a.proximo = b.proximo
        a.anterior = b
        b.anterior = None
        b.proximo = a
    
    elif b.proximo == None: #juntos no final
        b.anterior = a.anterior
        b.proximo = a 
        a.anterior.proximo = b
        a.anterior = b
        a.proximo = None


    elif a.anterior != None and b.proximo != None and a.proximo == b and b.anterior == a:  #juntos no meio
        a.anterior.proximo = b
        b.proximo.anterior = a
        b.anterior = a.anterior
        a.proximo = b.proximo
        a.anterior = b 
        b.proximo = a


    elif a.anterior == None and b.proximo != None and a.proximo == b and b.anterior == a: # cabeca e meio
        
        lista.cabeca = b 

        a.proximo.anterior = b 

        aux = a.proximo 

        a.proximo = b.proximo
        a.anterior = b.anterior

        b.anterior.proximo = a
        b.proximo.anterior = a

        b.proximo = aux
        b.anterior = None

    elif a == b:
        print("Posicoes iguais, ou seja, o mesmo node")




def busca(lista, valor):
    corrente = lista.cabeca
    while corrente and corrente.dado != valor:
        corrente = corrente.proximo
    return corrente


items = [10,9,8,7,6,5,4,3,2,1]



lista = ListaEncadeada()

for i in items:
	insere_no_inicio(lista, i)


print("Lista Original:")
lista.print_lista()


print("juntos no comeco", 1, 2)
swap(lista,2,1)

lista.print_lista()

print("juntos no final", 9, 10)
swap(lista,10,9)
lista.print_lista()

print("juntos no meio", 5, 6)
swap(lista,6,5)
lista.print_lista()
    
print("comeco e meio", 2, 5)
swap(lista,2,5)
lista.print_lista()