在Python中创建一个二重链接的列表

本文将演示用Python编程语言创建一个双链表。

在Python中创建一个双链式列表

一个双链表指的是一个由顺序链接的记录集组成的链接数据结构,称为节点。每个节点都包含一个上一个指针,一个下一个指针,和一个数据字段。

上一个和下一个指针指向上一个和下一个节点。第一个节点上的上一个指针和最后一个节点上的下一个指针都指向None

我们可以在双链表的某个节点前后插入一个新节点。此外,我们还可以向前和向后遍历双链表。

然而,每一个双链表的节点都需要额外的空间来放置前一个指针。

一个节点类被创建如下。指针和数据值默认为None

class Node:
    def __init__(self, next=None, previous=None, data=None):
        self.next = next
        self.previous = previous
        self.data = data

然后,用于双链表的类被创建。self.head 表示列表的头部,一开始是None

我们将使用add_to_end 函数在双链表的末端添加一个新的节点。首先,我们用new_node 变量创建一个 Node 类实例。

由于new_node 将是列表的最后一个值,我们将它的下一个指针设置为None 。我们定义last 变量来寻找我们将添加new_node 的节点。

首先,这个变量是双链表的头部(对于第一个添加的节点,这个头部将是None )。

我们检查self.head 是否是if 块中的None 。如果是,那么列表中就没有节点了,现在列表的头部将是新添加的节点。

while 块中,我们检查next 变量的指针last ,找到列表的最后一个值。我们用last.next 替换last 变量,直到我们得到None

当我们找到last.next 值为None 的节点时,我们结束列表。

我们将找到的last 节点值的next 指针设置为指向new_node 。最后,我们将new_node 变量的previous 指针设置为指向last 变量。

因此,new_node 节点被添加到双链表的末尾。

请看下面的代码。

class DoublyLinkedList:
    def __init__(self):
        self.head = None
    def add_to_end(self, new_node):
        new_node = Node(data = new_node)
        new_node.next = None
        last = self.head
        if self.head is None:
            new_node.previous = None
            self.head = new_node
            return
        while (last.next is not None):
            last = last.next
        last.next = new_node
        new_node.previous = last

我们可以使用add_to_beginning 函数将一个节点添加到双链表的开头。这个过程更加简单明了。

首先,我们将new_node 变量的指针next 设置为self.head ,将previous 指针设置为None 。因此,头部值,即旧列表的第一个值,成为new_node 所指向的下一个值。

if 块中,如果列表为空,我们检查self.head 值是否为None 。如果这个值是定义的,或者有一个与头部对应的节点,我们把这个节点的previous 指针改为new_node

最后,我们将self.head 改为new_node 。这样,new_node 被添加到双链表的开头。

请看下面的代码演示。

class DoublyLinkedList:
    def __init__(self):
        self.head = None
    def add_to_end(self, new_node):
        # previous function
    def add_to_beginning(self, new_node):
        new_node = Node(data = new_node)
        new_node.next = self.head
        new_node.previous = None
        if self.head is not None:
            self.head.previous = new_node
        self.head = new_node

在下面的例子中,首先创建了doubly_linked_list 变量。这个变量是DoublyLinkedList类的一个实例。

然后我们分别在列表的末尾添加13 ,在开头添加5 。列表的最终状态是5 -> 1 -> 3 -> None

doubly_linked_list = DoublyLinkedList()
doubly_linked_list.add_to_end(1)
doubly_linked_list.add_to_end(3)
doubly_linked_list.add_to_beginning(5)