双向链表是一种数据结构,它不仅存储了指向下一个节点的指针(next),还添加了一个指向前一个节点的指针(prev)。这种设计使得在双向链表中插入和删除元素变得更加灵活。双向链表的每个节点通常包含三个部分:数据域、前向指针以及后向指针。
初始化一个双向链表需要创建头节点和尾节点,并将它们相互链接,形成闭合环路,或者仅设置为单个空节点(未形成闭环)。
class Node:
def __init__(self, value=None):
self.value = value
self.next = None
self.prev = None
def create_node(value):
return Node(value)
# 初始化双向链表
head = create_node(None)
tail = head
将新节点的 next
指针指向当前尾节点,同时将尾节点的 prev
指向新节点,并更新尾节点为新节点。
def append(self, value):
new_node = create_node(value)
if self.tail is None:
# 如果链表为空,则新建一个节点
self.head = new_node
self.tail = new_node
else:
# 新节点的前向指针指向当前尾部,尾部后向指针指向新节点
new_node.prev = self.tail
self.tail.next = new_node
# 更新新的尾节点
self.tail = new_node
将新节点的 prev
指针指向当前头节点,同时将头节点的 next
指向新节点,并更新头节点为新节点。
def prepend(self, value):
new_node = create_node(value)
if self.head is None:
# 如果链表为空,则新建一个节点
self.head = new_node
self.tail = new_node
else:
# 新节点的后向指针指向当前头部,头部前向指针指向新节点
new_node.next = self.head
self.head.prev = new_node
# 更新新的头节点
self.head = new_node
在链表中的某个指定位置插入一个新节点。首先找到待插入的位置,然后调整前后指针指向。
def insert(self, position, value):
if position <= 0:
self.prepend(value)
elif position >= len(self) - 1:
self.append(value)
else:
current = self.head
index = 0
while index < position:
current = current.next
index += 1
new_node = create_node(value)
# 调整前后节点的指针指向新节点
current.prev.next = new_node
new_node.prev = current.prev
new_node.next = current
current.prev = new_node
找到尾节点,将其前一个节点的 next
指针设置为 None
,并更新尾指针。
def pop(self):
if self.tail is None:
return None
value = self.tail.value
# 如果是最后一个节点
if self.head == self.tail:
self.head = None
self.tail = None
else:
prev_tail = self.tail.prev
self.tail = prev_tail
prev_tail.next = None
return value
找到头节点,将其后一个节点的 prev
指针设置为 None
,并更新头指针。
def pop_first(self):
if self.head is None:
return None
value = self.head.value
# 如果只有一个节点
if self.head == self.tail:
self.head = None
self.tail = None
else:
new_head = self.head.next
self.head = new_head
new_head.prev = None
return value
找到要删除节点的位置,调整前后节点的指针指向。
def remove(self, position):
if position <= 0:
return self.pop_first()
elif position >= len(self) - 1:
return self.pop()
current = self.head
index = 0
while index < position:
current = current.next
index += 1
prev_node = current.prev
next_node = current.next
# 调整前后节点的指针指向
prev_node.next = next_node
if next_node:
next_node.prev = prev_node
遍历双向链表,可以通过从头部或尾部开始进行前向或者后向遍历。
def traverse(self, order="forward"):
current = self.head if order == "forward" else self.tail
while current:
yield current.value
current = current.next if order == "forward" else current.prev
计算链表中的节点数量。
def __len__(self):
count = 0
current = self.head
while current:
count += 1
current = current.next
return count
通过上述操作方法,可以灵活地进行双向链表的创建、插入、删除和遍历等基本操作。这些基础的实现将为更复杂的数据处理提供强有力的支持。