返回双链表的第一个元素

时间:2019-02-08 02:29:31

标签: python linked-list

我制作了一个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)

1 个答案:

答案 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_frontis None更好的Python,因为身份检查就足够了,而相等检查涉及间接的)。我认为其余的应该有用,但是我没有检查。