我得到了这个学校作业,这是我的代码:
class Doubly_linked_node():
def __init__(self, val):
self.value = val
self.next = None
self.prev = None
def __repr__(self):
return str(self.value)
class Deque():
def __init__(self):
self.header = Doubly_linked_node(None)
self.tailer = self.header
self.length = 0
def __repr__(self):
string = str(self.header.value)
index = self.header
while not (index.next is None):
string+=" " + str(index.next.value)
index = index.next
return string
def head_insert(self, item):
new = Doubly_linked_node(item)
new.next=self.header
self.header.prev=new
self.header=new
self.length+=1
if self.tailer.value==None:
self.tailer = self.header
def tail_insert(self, item):
new = Doubly_linked_node(item)
new.prev=self.tailer
self.tailer.next=new
self.tailer=new
self.length+=1
if self.header.value==None:
self.header = self.tailer
它构建一个堆栈,允许您添加和删除头部或尾部的项目(我没有包括所有代码只有重要的东西)。
当我发起一个对象时,如果我返回self.next
它会打印None
,但是如果我返回self.prev
,它就不会打印,只是跳过,我不明白为什么两者都定义与你看到的完全相同,如果我只插入头几次,例如for i in range(1,5): D.head_insert(i)
,然后我打印D
它打印5 4 3 2 1 None
但是如果我做尾插入例如{ {1}}并打印for i in range(1,5): D.tail_insert(i)
,在没有D
的情况下打印1 2 3 4 5"
。这是为什么?
我收录了一张图片:
答案 0 :(得分:1)
请注意,您创建的Deque
不是空的。您正在使用值为None
您正在交换value
和Node对象。当您查看if self.tailer.value==None:
时,它可能不是您的意思
点2之后是对空Deque的特殊处理,其中标题和尾标为None
如果我要实施Deque
,请注意以下内容。我稍微更改了__repr__
的返回值。
class Deque():
def __init__(self):
self.header = None
self.tailer = None
self.length = 0
def __repr__(self):
if self.header is None:
return 'Deque<>'
string = str(self.header.value)
index = self.header.next
while index!=None:
string+=" " + str(index.value)
index = index.next
return 'Deque<'+string+'>'
def head_insert(self, item):
new = Doubly_linked_node(item)
new.next=self.header
if self.length==0:
self.tailer=new
else:
self.header.prev=new
self.header=new
self.length+=1
def tail_insert(self, item):
new = Doubly_linked_node(item)
new.prev=self.tailer
if self.length==0:
self.header=new
else:
self.tailer.next=new
self.tailer=new
self.length+=1
答案 1 :(得分:1)
根据Günthers的建议,我已将__repr__
修改为:
def __repr__(self):
string = str(self.header.value)
index = self.header
while not (str(index.next) == "None"):
string += (" " + str(index.next.value))
index = index.next
return string
确实解决了这个问题,但这是我见过的最丑陋的解决方案。
有没有人知道更好的方法?
答案 2 :(得分:0)
关于更好的__repr__
方法的问题,我的建议。使用Deque
方法扩展__iter__
类。所以你可以迭代Deque
,这很好,例如:
for item in D:
print item
基于此__repr__
方法很简单。这是整个变化:
def __repr__(self):
return 'Deque<'+' '.join([str(item.value) for item in self])+'>'
def __iter__(self):
index=self.header
while index is not None:
yield index.value
index=index.next