python3 双向链表问题
class Node:#实现了链表节点的类def __init__(self,key,value):
self.key=key
self.value=value
self.next=None
self.prev=None#上一个节点的引用为空
def __str__(self):#直接输出对象ts时并没有按我们__str__方法中定义的格式进行输出,而用print输出的信息却改变了
val='{%d: %d}' % (self.key,self.value)
return val
def __repr__(self):#重构__repr__方法后,不管直接输出对象还是通过print打印的信息都按我们__repr__方法中定义的格式进行显示了
val = '{%d: %d}' % (self.key, self.value)
return val
class DoubleLinkedList:
def __init__(self,capacity=0xffff):
self.capacity=capacity
self.head=None
self.tail=None
self.size=0 #实现了双向链表
#从头部添加
def __add_head(self,node):
if not self.head:
self.head=node
self.tail=node
self.head.next=None
self.head.prev=None
else:
node.next=self.head
self.head.prev=node
self.head=node
self.head.prev=None
self.size += 1
return node#返回增加的节点
#从尾部添加
def __add_tail(self,node):
if not self.tail:
self.head=node
self.tail = node
self.tail.next=None
self.tail.prev=None
else:
self.tail.next=node
node.prev=self.tail
self.tail = node
self.tail.next=node
self.size += 1
return node #返回当前添加的节点
def __del_head(self):
if not self.head:
return
node=self.head
if node.next:
self.head=node.next
self.head.prev=None
else:
self.tail=self.head=None
self.size-=1
return node
def __del_tail(self):#私有的函数
if not self.tail:
return #直接返回
node=self.tail
if node.prev:
self.tail=node.prev
self.tail.next= None
else:
self.tail=self.head=None
self.size-=1
return node
#删除任意节点
def __remov(self,node):
#如果node==None,默认删除尾部节点
if not node:
node=self.tail
if node == self.tail:
self.__del_tail()
elif node==self.head:
self.__del_head()
else:
node.prve.next=node.next
node.next.prve=node.prev
self.size-=1
return node
#封装5个对外的api
#弹出头部节点
def pop(self):#公有的函数
return self.__del_head()
def append(self,node):
return self.__add_tail(node)
def append_front(self,node):
return self.__add_head(node)
def remove(self,node=None):
return self.__remov(node)
def print(self):
p = self.head#用一个属性指向当前头部
line = ''
while p:
line +='%s' % p
p = p.next
if p:
line += '=>'
print(line)
if __name__ == '__main__':
l = DoubleLinkedList(10)
nodes= []
for i in range(10):
node = Node(i,i)
nodes.append(node)
l.append(nodes)
l.print()
l.append(nodes)
l.print()
l.pop()
l.print()
l.append(nodes)
l.print()
l.append_front(nodes)
l.print()
l.append(nodes)
l.print()
l.remove(nodes)
l.print()
l.remove()
l.print()
结果只输出{0:0}
为何只能后面的代码都不输出了 class Node:#实现了链表节点的类
def __init__(self,key,value):
self.key=key
self.value=value
self.next=None
self.prev=None#上一个节点的引用为空
def __str__(self):#直接输出对象ts时并没有按我们__str__方法中定义的格式进行输出,而用print输出的信息却改变了
val='{%d: %d}' % (self.key,self.value)
return val
def __repr__(self):#重构__repr__方法后,不管直接输出对象还是通过print打印的信息都按我们__repr__方法中定义的格式进行显示了
val = '{%d: %d}' % (self.key, self.value)
return val
class DoubleLinkedList:
def __init__(self,capacity=0xffff):
self.capacity=capacity
self.head=None
self.tail=None
self.size=0 #实现了双向链表
#从头部添加
def __add_head(self,node):
if not self.head:
self.head=node
self.tail=node
self.head.next=None
self.head.prev=None
else:
node.next=self.head
self.head.prev=node
self.head=node
self.head.prev=None
self.size += 1
return node#返回增加的节点
#从尾部添加
def __add_tail(self,node):
if not self.tail:
self.head=node
self.tail = node
self.tail.next=None
self.tail.prev=None
else:
self.tail.next=node
node.prev=self.tail
self.tail = node
self.tail.next=None
self.size += 1
return node #返回当前添加的节点
def __del_head(self):
if not self.head:
return
node=self.head
if node.next:
self.head=node.next
self.head.prev=None
else:
self.tail=self.head=None
self.size-=1
return node
def __del_tail(self):#私有的函数
if not self.tail:
return #直接返回
node=self.tail
if node.prev:
self.tail=node.prev
self.tail.next= None
else:
self.tail=self.head=None
self.size-=1
return node
#删除任意节点
def __remov(self,node):
#如果node==None,默认删除尾部节点
if not node:
node=self.tail
if node == self.tail:
self.__del_tail()
elif node==self.head:
self.__del_head()
else:
node.prev.next=node.next
node.next.prev=node.prev
self.size-=1
return node
#封装5个对外的api
#弹出头部节点
def pop(self):#公有的函数
return self.__del_head()
def append(self,node):
return self.__add_tail(node)
def append_front(self,node):
return self.__add_head(node)
def remove(self,node=None):
return self.__remov(node)
def print(self):
p = self.head#用一个属性指向当前头部
line = ''
while p:
line +='%s' % p
p = p.next #此时self.head是Node实例
if p:
line += '=>'
print(line)
if __name__ == '__main__':
l = DoubleLinkedList()
nodes= [] #nodes=
for i in range(10):
node = Node(i,i)
nodes.append(node)
l.append(nodes)
l.print()
l.append(nodes)
l.print()
l.pop()
l.print()
l.append(nodes)
l.print()
l.append_front(nodes)
l.print()
l.append(nodes)
l.print()
l.remove(nodes)
l.print()
l.remove()
l.print()
解决了
页:
[1]