📌  相关文章
📜  数据结构示例-双向链表的中间插入新节点(1)

📅  最后修改于: 2023-12-03 14:54:57.495000             🧑  作者: Mango

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

双向链表是一种具有双向性质的链表结构,每个节点除了包含指向后继节点的指针外,还包含指向前驱节点的指针。这种结构使得链表可以从前往后遍历,也可以从后往前遍历。

在双向链表中,插入一个新节点并不像单向链表那样只需要修改前驱节点的指针就可以了,还需要修改后继节点的前驱指针。下面是一个示例程序,实现在双向链表的中间位置插入新节点的功能。

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
        self.length = 0

    def add(self, data):
        new_node = Node(data)
        if self.length == 0:
            self.head = new_node
            self.tail = new_node
        else:
            self.tail.next = new_node
            new_node.prev = self.tail
            self.tail = new_node
        self.length += 1

    def insert(self, index, data):
        if index < 0 or index > self.length:
            raise IndexError('Index out of range')
        new_node = Node(data)
        if index == 0:
            new_node.next = self.head
            self.head.prev = new_node
            self.head = new_node
        elif index == self.length:
            self.tail.next = new_node
            new_node.prev = self.tail
            self.tail = new_node
        else:
            current = self.head
            for i in range(index):
                current = current.next
            new_node.next = current
            new_node.prev = current.prev
            current.prev.next = new_node
            current.prev = new_node
        self.length += 1

这段代码实现了双向链表的基本功能,包括添加新节点和在指定位置插入新节点。其中,add方法用于在链表末尾添加新节点,insert方法使用了双重循环找到待插入位置,并修改相应节点的指针。

如果需要在双向链表中删除节点,可以根据节点的位置修改前驱和后继节点的指针即可。另外,如果要遍历整个链表,只需要从头节点开始依次遍历,每次访问一个节点的同时访问它的后继节点。如果要从后往前遍历,只需要从尾节点开始遍历,每次访问一个节点的同时访问它的前驱节点。

双向链表具有单向链表所没有的遍历优势,可以提高某些算法的效率。但是它的空间复杂度相比于单向链表更高,因为每个节点都需要指向前驱节点的指针。因此,应该根据具体情况选择链表的类型。