# -*- 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, prior=None):
self.value = value
self.next = next
self.prior = prior
def __str__(self):
return "{0} : ({1}, {2}, {3})".format(printAddr(self),
self.value, printAddr(self.next), printAddr(self.prior) )
class DoubleLinkedList:
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
#Busca um elemento na lista e retorna o nó encontrado
def find(self, v):
if self.isEmpty() : return None
p = self.head
while p :
if p.value == v :
return p
p = p.next
return None
#Insere no inicio da Lista
def insert(self, value):
newNode = Node(value, self.head)
if not self.isEmpty() :
self.head.prior = newNode
self.head = newNode
return newNode
#Remove um nó baseado no valor
def remove(self, val):
#Busca pelo nó p na lista
p = self.find(val)
if not p : return False
#Caso p seja o primeiro, atualiza head com o próximo dele
if self.head == p :
self.head = p.next
else: # Neste caso atualiza o próximo no anterior de p para o próximo de p
p.prior.next = p.next
#Caso p tenha próximo, atualiza o anterior do próximo de p com o anterior de p
if p.next : p.next.prior = p.prior
del p #Remove p da memória
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
#Retorna representação em string da lista com as informação sobre apontamentos
def debug(self) :
cn = self.head
r = "["
while cn :
r = "[" if cn == self.head else r + ", "
r = "{0}{1}({2}, {3}, {4})".format(r, str(cn.value), printAddr(cn),
printAddr(cn.next), printAddr(cn.prior))
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 = DoubleLinkedList()
print("Inserindo no início")
ll.insert(10)
ll.insert(20)
ll.insert(30)
print(ll, len(ll), ll.isEmpty())
print(ll.debug())
print(ll.find(20))
print("Remove 55:", "Removeu" if ll.remove(55) else "Não Removeu")
print(ll.debug())
print("Remove 20:", "Removeu" if ll.remove(20) else "Não Removeu")
print(ll.debug())
print("Remove 10:", "Removeu" if ll.remove(10) else "Não Removeu")
print(ll.debug())
print("Remove 30:", "Removeu" if ll.remove(30) else "Não Removeu")
print(ll.debug())
ll.insert(10)
ll.insert(20)
ll.insert(30)
print(ll.debug())
ll.clear()
print(ll, ll.isEmpty(), len(ll))
IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KIyBVc2FkbyBjb25jZWl0byBkZSBjbGFzc2UgcGFyYSByZXByZXNlbnRhciBhIGltcGxlbWVudGHDp8OjbyBkYSBsaXN0YSBlbmNhZGVhZGEgc2ltcGxlcy4KCiMgTyBuw7Mgw6kgaW1wbGVtZW50YWRvIHBlbGEgY2xhc3NlIE5vZGUKCiNGdW7Dp8OjbyBwYXJhIGltcHJpbWlyIGVuZGVyZcOnbyBkZSBtZW1vcmlhIGRhIHZhcmnDoXZlbApkZWYgcHJpbnRBZGRyKHYpOgogICAgaWYgdiBpcyBOb25lIDoKICAgICAgICByZXR1cm4gIk5vbmUiCiAgICBlbHNlOgogICAgICAgIHMgPSBzdHIoaWQodikpCiAgICAgICAgY3JvcFMgPSBsZW4ocyktNQogICAgICAgIHJldHVybiBzW2Nyb3BTOl0KCmNsYXNzIE5vZGU6CiAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUsIG5leHQ9Tm9uZSwgcHJpb3I9Tm9uZSk6CiAgICAgICAgc2VsZi52YWx1ZSA9IHZhbHVlCiAgICAgICAgc2VsZi5uZXh0ID0gbmV4dAogICAgICAgIHNlbGYucHJpb3IgPSBwcmlvcgoKICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgIHJldHVybiAiezB9IDogKHsxfSwgezJ9LCB7M30pIi5mb3JtYXQocHJpbnRBZGRyKHNlbGYpLAogICAgICAgICAgc2VsZi52YWx1ZSwgcHJpbnRBZGRyKHNlbGYubmV4dCksIHByaW50QWRkcihzZWxmLnByaW9yKSApCgpjbGFzcyBEb3VibGVMaW5rZWRMaXN0OgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHNlbGYuaGVhZCA9IE5vbmUKCiAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICBjbiA9IHNlbGYuaGVhZAogICAgICAgIHIgPSAiWyIKICAgICAgICB3aGlsZSBjbiA6CiAgICAgICAgICAgIHIgPSAiWyIgaWYgY24gPT0gc2VsZi5oZWFkIGVsc2UgciArICIsICIKICAgICAgICAgICAgciA9ICJ7MH17MX0iLmZvcm1hdChyLCBzdHIoY24udmFsdWUpKQogICAgICAgICAgICBjbiA9IGNuLm5leHQKICAgICAgICByZXR1cm4gciArICJdIgoKICAgIGRlZiBfX2xlbl9fKHNlbGYpIDoKICAgICAgICBpZiBzZWxmLmlzRW1wdHkoKSA6IHJldHVybiAwCgogICAgICAgIHAgPSBzZWxmLmhlYWQKICAgICAgICBjID0gMAogICAgICAgIHdoaWxlIHAgOgogICAgICAgICAgICBjICs9IDEKICAgICAgICAgICAgcCA9IHAubmV4dAoKICAgICAgICByZXR1cm4gYwoKICAgICNCdXNjYSB1bSBlbGVtZW50byBuYSBsaXN0YSBlIHJldG9ybmEgbyBuw7MgZW5jb250cmFkbwogICAgZGVmIGZpbmQoc2VsZiwgdik6CiAgICAgICAgaWYgc2VsZi5pc0VtcHR5KCkgOiByZXR1cm4gTm9uZQoKICAgICAgICBwID0gc2VsZi5oZWFkCiAgICAgICAgd2hpbGUgcCA6CiAgICAgICAgICAgIGlmIHAudmFsdWUgPT0gdiA6CiAgICAgICAgICAgICAgICByZXR1cm4gcAogICAgICAgICAgICBwID0gcC5uZXh0CgogICAgICAgIHJldHVybiBOb25lCgogICAgI0luc2VyZSBubyBpbmljaW8gZGEgTGlzdGEKICAgIGRlZiBpbnNlcnQoc2VsZiwgdmFsdWUpOgogICAgICAgIG5ld05vZGUgPSBOb2RlKHZhbHVlLCBzZWxmLmhlYWQpCiAgICAgICAgaWYgbm90IHNlbGYuaXNFbXB0eSgpIDoKICAgICAgICAgICAgc2VsZi5oZWFkLnByaW9yID0gbmV3Tm9kZQogICAgICAgIHNlbGYuaGVhZCA9IG5ld05vZGUKICAgICAgICByZXR1cm4gbmV3Tm9kZQoKICAgICNSZW1vdmUgdW0gbsOzIGJhc2VhZG8gbm8gdmFsb3IKICAgIGRlZiByZW1vdmUoc2VsZiwgdmFsKToKICAgICAgICAjQnVzY2EgcGVsbyBuw7MgcCBuYSBsaXN0YQogICAgICAgIHAgPSBzZWxmLmZpbmQodmFsKQogICAgICAgIGlmIG5vdCBwIDogcmV0dXJuIEZhbHNlCgogICAgICAgICNDYXNvIHAgc2VqYSBvIHByaW1laXJvLCBhdHVhbGl6YSBoZWFkIGNvbSBvIHByw7N4aW1vIGRlbGUKICAgICAgICBpZiBzZWxmLmhlYWQgPT0gcCA6CiAgICAgICAgICAgIHNlbGYuaGVhZCA9IHAubmV4dAogICAgICAgIGVsc2U6ICMgTmVzdGUgY2FzbyBhdHVhbGl6YSBvIHByw7N4aW1vIG5vIGFudGVyaW9yIGRlIHAgcGFyYSBvIHByw7N4aW1vIGRlIHAKICAgICAgICAgICAgcC5wcmlvci5uZXh0ID0gcC5uZXh0CgogICAgICAgICNDYXNvIHAgdGVuaGEgcHLDs3hpbW8sIGF0dWFsaXphIG8gYW50ZXJpb3IgZG8gcHLDs3hpbW8gZGUgcCBjb20gbyBhbnRlcmlvciBkZSBwCiAgICAgICAgaWYgcC5uZXh0IDogcC5uZXh0LnByaW9yID0gcC5wcmlvcgoKICAgICAgICBkZWwgcCAjUmVtb3ZlIHAgZGEgbWVtw7NyaWEKICAgICAgICByZXR1cm4gVHJ1ZQoKICAgICNMaW1wYSB0b2RvcyBvcyBlbGVtZW50b3MgZGEgbGlzdGEKICAgIGRlZiBjbGVhcihzZWxmKSA6CiAgICAgICAgcCA9IHNlbGYuaGVhZAogICAgICAgIHNlbGYuaGVhZCA9IE5vbmUKICAgICAgICB0ID0gTm9uZQogICAgICAgIHdoaWxlIHAgOgogICAgICAgICAgICB0ID0gcC5uZXh0CiAgICAgICAgICAgIGRlbCBwCiAgICAgICAgICAgIHAgPSB0CgogICAgI1ZlcmlmaWNhIHNlIGEgbGlzdGEgZXN0w6EgdmF6aWEKICAgIGRlZiBpc0VtcHR5KHNlbGYpIDogcmV0dXJuIHNlbGYuaGVhZCA9PSBOb25lCgogICAgI1JldG9ybmEgcmVwcmVzZW50YcOnw6NvIGVtIHN0cmluZyBkYSBsaXN0YSBjb20gYXMgaW5mb3JtYcOnw6NvIHNvYnJlIGFwb250YW1lbnRvcwogICAgZGVmIGRlYnVnKHNlbGYpIDoKICAgICAgICBjbiA9IHNlbGYuaGVhZAogICAgICAgIHIgPSAiWyIKICAgICAgICB3aGlsZSBjbiA6CiAgICAgICAgICAgIHIgPSAiWyIgaWYgY24gPT0gc2VsZi5oZWFkIGVsc2UgciArICIsICIKICAgICAgICAgICAgciA9ICJ7MH17MX0oezJ9LCB7M30sIHs0fSkiLmZvcm1hdChyLCBzdHIoY24udmFsdWUpLCBwcmludEFkZHIoY24pLAogICAgICAgICAgICAgICAgcHJpbnRBZGRyKGNuLm5leHQpLCBwcmludEFkZHIoY24ucHJpb3IpKQogICAgICAgICAgICBjbiA9IGNuLm5leHQKICAgICAgICByZXR1cm4gciArICJdIgojIEZpbSBjbGFzc2UKCiNFeGVtcGxvcyBkZSB1c28KcHJpbnQoIk5vZGUgYWRkcjoiLCBzdHIoaWQoTm9uZSkpWzEwOl0pCnByaW50KCJDcmlhw6fDo28gbsOzczoiKQpuMSA9IE5vZGUoMTAsIE5vbmUpCnByaW50KG4xKQpuMiA9IE5vZGUoMjAsIG4xKQpwcmludChuMikKCnByaW50KCJcbkNyaWHDp8OjbyBsaXN0YToiKQpsbCA9IERvdWJsZUxpbmtlZExpc3QoKQoKcHJpbnQoIkluc2VyaW5kbyBubyBpbsOtY2lvIikKbGwuaW5zZXJ0KDEwKQpsbC5pbnNlcnQoMjApCmxsLmluc2VydCgzMCkKcHJpbnQobGwsIGxlbihsbCksIGxsLmlzRW1wdHkoKSkKcHJpbnQobGwuZGVidWcoKSkKcHJpbnQobGwuZmluZCgyMCkpCgpwcmludCgiUmVtb3ZlIDU1OiIsICJSZW1vdmV1IiBpZiBsbC5yZW1vdmUoNTUpIGVsc2UgIk7Do28gUmVtb3ZldSIpCnByaW50KGxsLmRlYnVnKCkpCnByaW50KCJSZW1vdmUgMjA6IiwgIlJlbW92ZXUiIGlmIGxsLnJlbW92ZSgyMCkgZWxzZSAiTsOjbyBSZW1vdmV1IikKcHJpbnQobGwuZGVidWcoKSkKcHJpbnQoIlJlbW92ZSAxMDoiLCAiUmVtb3ZldSIgaWYgbGwucmVtb3ZlKDEwKSBlbHNlICJOw6NvIFJlbW92ZXUiKQpwcmludChsbC5kZWJ1ZygpKQpwcmludCgiUmVtb3ZlIDMwOiIsICJSZW1vdmV1IiBpZiBsbC5yZW1vdmUoMzApIGVsc2UgIk7Do28gUmVtb3ZldSIpCnByaW50KGxsLmRlYnVnKCkpCgpsbC5pbnNlcnQoMTApCmxsLmluc2VydCgyMCkKbGwuaW5zZXJ0KDMwKQpwcmludChsbC5kZWJ1ZygpKQpsbC5jbGVhcigpCnByaW50KGxsLCBsbC5pc0VtcHR5KCksIGxlbihsbCkp
Node addr: 2272
Criação nós:
86024 : (10, None, None)
86080 : (20, 86024, None)
Criação lista:
Inserindo no início
[30, 20, 10] 3 False
[30(86416, 86360, None), 20(86360, 86304, 86416), 10(86304, None, 86360)]
86360 : (20, 86304, 86416)
Remove 55: Não Removeu
[30(86416, 86360, None), 20(86360, 86304, 86416), 10(86304, None, 86360)]
Remove 20: Removeu
[30(86416, 86304, None), 10(86304, None, 86416)]
Remove 10: Removeu
[30(86416, None, None)]
Remove 30: Removeu
[]
[30(86584, 86360, None), 20(86360, 86416, 86584), 10(86416, None, 86360)]
[] True 0