在双向链表中间插入新节点的Python程序

在双向链表中间插入新节点的Python程序

双向链表是一种链式数据结构,它的每个节点包含两个指针,一个指向前一个节点,另一个指向后一个节点。与单向链表相比,双向链表可以从前向后或从后向前遍历,因此在某些场景下更为灵活。

在双向链表中添加节点的方法与单向链表类似,但是在插入节点时需要考虑更多的指针操作。本文将介绍在双向链表中间插入新节点的Python程序,并为代码中涉及的关键步骤做详细的解释。

更多Python相关文章,请阅读:Python 教程

节点类定义

在使用双向链表时,首先需要定义节点类。类中包含节点的值和前向后向指针。

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

双向链表类定义

定义好节点类后,我们需要再定义双向链表类。类中包含头节点和尾节点,以及一些操作方法,如添加节点、删除节点、打印链表等。

class DoublyLinkedList:
    def __init__(self):
        self.head = None
        self.tail = None

    def append(self, data):
        node = Node(data)
        if not self.head:
            self.head = node
            self.tail = node
            return
        node.prev = self.tail
        self.tail.next = node
        self.tail = node

    def prepend(self, data):
        node = Node(data)
        if not self.head:
            self.head = node
            self.tail = node
            return
        node.next = self.head
        self.head.prev = node
        self.head = node

    def print_list(self):
        node = self.head
        while node:
            print(node.data)
            node = node.next

    def insert_after_node(self, prev_node, data):
        if not prev_node:
            print("Previous node is not in the list")
            return
        node = Node(data)
        node.next = prev_node.next
        node.prev = prev_node
        if node.next:
            node.next.prev = node
        else:
            self.tail = node
        prev_node.next = node

上述代码中,包含四个方法:

  • append()方法:在链表尾部添加新节点。
  • prepend()方法:在链表头部添加新节点。
  • print_list()方法:打印整个链表。
  • insert_after_node()方法:在给定的节点后面插入新节点。

在双向链表中间插入新节点

在双向链表中间插入新节点与在单向链表中插入新节点类似,需要先找到要插入位置的前一个节点,然后操作指针链接,将新节点插入到链表中。

下面是示例代码:

doublyLinkedList = DoublyLinkedList()
doublyLinkedList.append(1)
doublyLinkedList.append(2)
doublyLinkedList.append(4)
doublyLinkedList.append(5)
doublyLinkedList.print_list()
node = doublyLinkedList.head.next.next # node的值为指向节点3的指针
doublyLinkedList.insert_after_node(node, 3)
doublyLinkedList.print_list()

在上面的代码中,首先定义一个双向链表,并向其中添加四个节点。然后找到要插入位置的前一个节点,即指向节点3的指针。接着调用insert_after_node()方法,在指向节点3的指针后面插入新节点3。最后打印整个链表,可以看到新节点已经成功插入链表中。

解释关键步骤

在上面的代码中,我们使用了insert_after_node()方法向链表中插入新节点,接下来我们来具体解释一下这个方法的关键步骤。

首先,在方法中判断要插入的位置是否合法,即前一个节点是否在链表中。如果不在,就打印提示信息并退出方法。

if not prev_node:
    print("Previous node is not in the list")
    return

然后,创建新的节点并指定它的值。

node = Node(data)

将新节点的指针链接到前一个节点的下一个节点,将前一个节点的下一个指针链接到新节点。同时,将新节点的前向指针链接到前一个节点。

node.next = prev_node.next
prev_node.next = node
node.prev = prev_node

如果新节点的下一个节点存在,则将它的前向指针链接到新节点。

if node.next:
    node.next.prev = node

如果新节点加入了链表尾部,则需要更新链表的尾节点。

else:
    self.tail = node

结论

以上就是在双向链表中间插入新节点的Python程序及解释。双向链表适用于需要频繁在链表中间添加或删除节点的场景。在插入新节点时,需要考虑更多的指针操作,但是通过定义好的节点和链表类,可以让插入节点的操作变得更为方便和简洁。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程