Estou tentando escrever um método add para lista vinculada em python, mas não está se comportando conforme o esperado.
class linkedlist:
def __init__(self):
self.item=None
self.next=None
def add(self,val):
self.next=self
self.item=val
Isso não funciona. Quando eu crio um objeto:
myobj=linkedlist()
myobj.add(1)
myobj.add(2)
print(myobj.next.item)
dá 2, em vez de 1, como seria de esperar. Onde foi que eu errei?
Tentei consultar É seguro substituir um objeto próprio por outro objeto do mesmo tipo em um método? mas não está ajudando.
Eu sugiro que você separe os tipos
node
elinkedlist
enode
. Anode
tem uma referência aonext
node
. Embora alinkedlist
tenha uma referência ahead
node
e geralmente a atail
node
, adicionar um novonode
é uma operação constante (ou seja, não requer percorrer toda a lista). Isso torna mais fácil ver que você precisa de uma novanode
instância por chamada paraadd()
:e aqui está um exemplo de saída:
Você tem apenas 1 objeto e 2 referências apontando para ele. Você precisa copiar a lista antes de adicioná-la:
Para esclarecer:
com seu código:
Com o meu:
ATUALIZAR:
Primeiro, suas expectativas estão erradas, você deve obter 3 e 2, que são os valores deixados na lista depois que você estourou a cabeça. Para obter esses resultados, você precisa atualizar o que
a
aponta. Você poderia fazer isso adicionandoreturn self
no final dos métodosadd
andpop
e reatribuindoa
:Mas, na IMO, isso é bastante feio e prefiro usar a abordagem de Allan ...