# -*- coding: utf-8 -*-
# Usado conceito de classe para representar a implementação da lista encadeada simples.
# O nó é implementado pela classe Node
#Função para imprimir endereço de memoria da variável
def printAddr(v):
if v is None :
return "None"
else:
s = str(id(v))
cropS = len(s)-5
return s[cropS:]
class Node:
def __init__(self, value, next=None):
self.value = value
self.next = next
def __str__(self):
return "{0} : ({1}, {2})".format(printAddr(self),
self.value, printAddr(self.next) )
class SimpLinkedList:
def __init__(self):
self.head = None
def __str__(self):
cn = self.head
r = "["
while cn :
r = "[" if cn == self.head else r + ", "
r = "{0}{1}".format(r, str(cn.value))
cn = cn.next
return r + "]"
def __len__(self) :
if self.isEmpty() : return 0
p = self.head
c = 0
while p :
c += 1
p = p.next
return c
#Insere no inicio da Lista
def insert(self, value):
newNode = Node(value, self.head)
self.head = newNode
return newNode
#Remove um nó baseado no valor
def remove(self, val):
if self.isEmpty() : return False
ant = None
p = self.head
#Procura por val e o nó anterior
while p and p.value != val :
ant = p
p = p.next
#Verifica se achou o valor. Caso não achou retorna falso
if not p : return False
#Liberação de p para remoção
#Se ant e None então passa a ref de p para head
if not ant :
self.head = p.next
else: # Senao remove a referencia de p do ant
ant.next = p.next
del p
return True
#Limpa todos os elementos da lista
def clear(self) :
p = self.head
self.head = None
t = None
while p :
t = p.next
del p
p = t
#Verifica se a lista está vazia
def isEmpty(self) : return self.head == None
def debug(self) :
cn = self.head
r = "["
while cn :
r = "[" if cn == self.head else r + ", "
r = "{0}{1}({2}, {3})".format(r, str(cn.value), printAddr(cn),
printAddr(cn.next))
cn = cn.next
return r + "]"
# Fim classe
#Exemplos de uso
print("Node addr:", str(id(None))[10:])
print("Criação nós:")
n1 = Node(10, None)
print(n1)
n2 = Node(20, n1)
print(n2)
print("\nCriação lista:")
ll = SimpLinkedList()
print("Inserindo no início")
ll.insert(11)
ll.insert(30)
print(ll, len(ll), ll.isEmpty())
print(ll.debug())
print("Removeu" if ll.remove(55) else "Não Removeu")
print("Remoção:", ll)
ll.clear()
print(ll, ll.isEmpty(), len(ll))
IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIyBVc2FkbyBjb25jZWl0byBkZSBjbGFzc2UgcGFyYSByZXByZXNlbnRhciBhIGltcGxlbWVudGHDp8OjbyBkYSBsaXN0YSBlbmNhZGVhZGEgc2ltcGxlcy4KCiMgTyBuw7Mgw6kgaW1wbGVtZW50YWRvIHBlbGEgY2xhc3NlIE5vZGUKCiNGdW7Dp8OjbyBwYXJhIGltcHJpbWlyIGVuZGVyZcOnbyBkZSBtZW1vcmlhIGRhIHZhcmnDoXZlbApkZWYgcHJpbnRBZGRyKHYpOgogICAgaWYgdiBpcyBOb25lIDoKICAgICAgICByZXR1cm4gIk5vbmUiCiAgICBlbHNlOgogICAgICAgIHMgPSBzdHIoaWQodikpCiAgICAgICAgY3JvcFMgPSBsZW4ocyktNQogICAgICAgIHJldHVybiBzW2Nyb3BTOl0KCmNsYXNzIE5vZGU6CiAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUsIG5leHQ9Tm9uZSk6CiAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCiAgICAgICAgc2VsZi5uZXh0ID0gbmV4dAoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiezB9IDogKHsxfSwgezJ9KSIuZm9ybWF0KHByaW50QWRkcihzZWxmKSwKICAgICAgICAgIHNlbGYudmFsdWUsIHByaW50QWRkcihzZWxmLm5leHQpICkKCmNsYXNzIFNpbXBMaW5rZWRMaXN0OgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuaGVhZCA9IE5vbmUKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICBjbiA9IHNlbGYuaGVhZAogICAgICAgIHIgPSAiWyIKICAgICAgICB3aGlsZSBjbiA6CiAgICAgICAgICAgIHIgPSAiWyIgaWYgY24gPT0gc2VsZi5oZWFkIGVsc2UgciArICIsICIKICAgICAgICAgICAgciA9ICJ7MH17MX0iLmZvcm1hdChyLCBzdHIoY24udmFsdWUpKQogICAgICAgICAgICBjbiA9IGNuLm5leHQKICAgICAgICByZXR1cm4gciArICJdIgoKICAgIGRlZiBfX2xlbl9fKHNlbGYpIDoKICAgICAgICBpZiBzZWxmLmlzRW1wdHkoKSA6IHJldHVybiAwCgogICAgICAgIHAgPSBzZWxmLmhlYWQKICAgICAgICBjID0gMAogICAgICAgIHdoaWxlIHAgOgogICAgICAgICAgICBjICs9IDEKICAgICAgICAgICAgcCA9IHAubmV4dAoKICAgICAgICByZXR1cm4gYwoKICAgICNJbnNlcmUgbm8gaW5pY2lvIGRhIExpc3RhCiAgICBkZWYgaW5zZXJ0KHNlbGYsIHZhbHVlKToKICAgICAgICBuZXdOb2RlID0gTm9kZSh2YWx1ZSwgc2VsZi5oZWFkKQogICAgICAgIHNlbGYuaGVhZCA9IG5ld05vZGUKICAgICAgICByZXR1cm4gbmV3Tm9kZQoKICAgICNSZW1vdmUgdW0gbsOzIGJhc2VhZG8gbm8gdmFsb3IKICAgIGRlZiByZW1vdmUoc2VsZiwgdmFsKToKICAgICAgICBpZiBzZWxmLmlzRW1wdHkoKSA6IHJldHVybiBGYWxzZQoKICAgICAgICBhbnQgPSBOb25lCiAgICAgICAgcCA9IHNlbGYuaGVhZAoKICAgICAgICAjUHJvY3VyYSBwb3IgdmFsIGUgbyBuw7MgYW50ZXJpb3IKICAgICAgICB3aGlsZSBwIGFuZCBwLnZhbHVlICE9IHZhbCA6CiAgICAgICAgICAgIGFudCA9IHAKICAgICAgICAgICAgcCA9IHAubmV4dAoKICAgICAgICAjVmVyaWZpY2Egc2UgYWNob3UgbyB2YWxvci4gQ2FzbyBuw6NvIGFjaG91IHJldG9ybmEgZmFsc28KICAgICAgICBpZiBub3QgcCA6IHJldHVybiBGYWxzZQoKICAgICAgICAjTGliZXJhw6fDo28gZGUgcCBwYXJhIHJlbW/Dp8OjbwogICAgICAgICNTZSBhbnQgZSBOb25lIGVudMOjbyBwYXNzYSBhIHJlZiBkZSBwIHBhcmEgaGVhZAogICAgICAgIGlmIG5vdCBhbnQgOgogICAgICAgICAgICBzZWxmLmhlYWQgPSBwLm5leHQKICAgICAgICBlbHNlOiAjIFNlbmFvIHJlbW92ZSBhIHJlZmVyZW5jaWEgZGUgcCBkbyBhbnQKICAgICAgICAgICAgYW50Lm5leHQgPSBwLm5leHQKCiAgICAgICAgZGVsIHAKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICNMaW1wYSB0b2RvcyBvcyBlbGVtZW50b3MgZGEgbGlzdGEKICAgIGRlZiBjbGVhcihzZWxmKSA6CiAgICAgICAgcCA9IHNlbGYuaGVhZAogICAgICAgIHNlbGYuaGVhZCA9IE5vbmUKICAgICAgICB0ID0gTm9uZQogICAgICAgIHdoaWxlIHAgOgogICAgICAgICAgICB0ID0gcC5uZXh0CiAgICAgICAgICAgIGRlbCBwCiAgICAgICAgICAgIHAgPSB0CgogICAgI1ZlcmlmaWNhIHNlIGEgbGlzdGEgZXN0w6EgdmF6aWEKICAgIGRlZiBpc0VtcHR5KHNlbGYpIDogcmV0dXJuIHNlbGYuaGVhZCA9PSBOb25lCgogICAgZGVmIGRlYnVnKHNlbGYpIDoKICAgICAgICBjbiA9IHNlbGYuaGVhZAogICAgICAgIHIgPSAiWyIKICAgICAgICB3aGlsZSBjbiA6CiAgICAgICAgICAgIHIgPSAiWyIgaWYgY24gPT0gc2VsZi5oZWFkIGVsc2UgciArICIsICIKICAgICAgICAgICAgciA9ICJ7MH17MX0oezJ9LCB7M30pIi5mb3JtYXQociwgc3RyKGNuLnZhbHVlKSwgcHJpbnRBZGRyKGNuKSwKICAgICAgICAgICAgICAgIHByaW50QWRkcihjbi5uZXh0KSkKICAgICAgICAgICAgY24gPSBjbi5uZXh0CiAgICAgICAgcmV0dXJuIHIgKyAiXSIKIyBGaW0gY2xhc3NlCgojRXhlbXBsb3MgZGUgdXNvCnByaW50KCJOb2RlIGFkZHI6Iiwgc3RyKGlkKE5vbmUpKVsxMDpdKQpwcmludCgiQ3JpYcOnw6NvIG7Ds3M6IikKbjEgPSBOb2RlKDEwLCBOb25lKQpwcmludChuMSkKbjIgPSBOb2RlKDIwLCBuMSkKcHJpbnQobjIpCgpwcmludCgiXG5Dcmlhw6fDo28gbGlzdGE6IikKbGwgPSBTaW1wTGlua2VkTGlzdCgpCgpwcmludCgiSW5zZXJpbmRvIG5vIGluw61jaW8iKQpsbC5pbnNlcnQoMTEpCmxsLmluc2VydCgzMCkKcHJpbnQobGwsIGxlbihsbCksIGxsLmlzRW1wdHkoKSkKcHJpbnQobGwuZGVidWcoKSkKCnByaW50KCJSZW1vdmV1IiBpZiBsbC5yZW1vdmUoNTUpIGVsc2UgIk7Do28gUmVtb3ZldSIpCnByaW50KCJSZW1vw6fDo286IiwgbGwpCmxsLmNsZWFyKCkKcHJpbnQobGwsIGxsLmlzRW1wdHkoKSwgbGVuKGxsKSkK