📅  最后修改于: 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
方法使用了双重循环找到待插入位置,并修改相应节点的指针。
如果需要在双向链表中删除节点,可以根据节点的位置修改前驱和后继节点的指针即可。另外,如果要遍历整个链表,只需要从头节点开始依次遍历,每次访问一个节点的同时访问它的后继节点。如果要从后往前遍历,只需要从尾节点开始遍历,每次访问一个节点的同时访问它的前驱节点。
双向链表具有单向链表所没有的遍历优势,可以提高某些算法的效率。但是它的空间复杂度相比于单向链表更高,因为每个节点都需要指向前驱节点的指针。因此,应该根据具体情况选择链表的类型。