我制作了一个Node和Deque类来表示一个双链表。我编写了一个函数来返回链表中的第一项,但是却得到了IndexError-如果链表为空,我在代码中会引发一个错误。
我的预期输出:
my_list.push_front(1)
my_list.push_front(2)
my_list.push_front(3)
linked list is [3, 2, 1]
print(my_list.peek_front()) --> 3
我的链表功能文件:
class Node:
"""
Initialize empty node
"""
def __init__(self, data=None, prev = None, next = None):
self.data = data
self.next = next
self.prev = prev
class Deque:
"""
A double-ended queue
"""
def __init__(self):
"""
Initializes an empty Deque
"""
self.head = Node()
def push_front(self, e): #should work fine
"""
Inserts an element at the front of the Deque
:param e: An element to insert
"""
new_head = Node(data = e, next = self.head)
if self.head:
self.head.prev = new_head
self.head = new_head
def peek_front(self): #FUNCTION WITH ERROR
"""
Looks at, but does not remove, the first element
:return: The first element
"""
if self.head.data == None: #if it is empty, raise error
raise IndexError
else:
return self.head.data
def listprint(self, node):
"""
Prints each element of the node front to back
:param node:
"""
while (node is not None):
print(node.data)
last = node
node = node.next
我的主文件:
def main():
my_list = Deque()
my_list.push_front(1)
my_list.push_front(2)
my_list.push_front(3)
my_list.listprint(my_list.head) #print elements in the list
print(my_list.peek_front())
我的错误消息:
IndexError (error that was unintentionally raised by me)
答案 0 :(得分:1)
没有收到您的错误(我尝试使用python2和python3,尽管出于懒惰,我只是将其作为没有def main()
的脚本来运行)。
但是,输出在列表打印的末尾列出了None
:
$ python test.py
3
2
1
None
3
这是因为您的__init__
创建的不是空双端队列,而是具有单个节点且具有空数据的双端队列。也许这是实现空双端队列的方法(如果您问我,这不是一个好主意),但是当您在双端队列中添加新内容时,这个空数据节点仍然存在就不会感到惊讶(毕竟,您永远不会删除它)。
如果要解决此问题,请在self.head = Node()
中将self.head = None
替换为__init__
,并在{{1}中将if self.head.data == None
替换为if self.head is None
}(注意:peek_front
比is None
更好的Python,因为身份检查就足够了,而相等检查涉及间接的)。我认为其余的应该有用,但是我没有检查。