class ListNode:
def __init__(self, value):
self.val = value # 节点存储的值
self.prev = None # 指向前一个节点的指针
self.next = None # 指向后一个节点的指针
class DoublyLinedList:
def __init__(self):
self.head = None # 链表头节点
self.tail = None # 链表尾节点
self.size = 0 # 链表长度
def is_empty(self):
"""检查链表是否为空"""
return self.size == 0
def get_size(self):
"""获取链表长度"""
return self.size
def add_at_head(self, value):
"""在链表头部添加节点"""
# 创建新节点
node = ListNode(value)
# 如果链表为空,新节点既是头节点也是尾节点
if self.size == 0:
self.head = node
self.tail = node
else:
# 链表不为空时,将新节点插入到头部
node.next = self.head # 新节点的next指向原头节点
self.head.prev = node # 原头节点的prev指向新节点
self.head = node # 更新头节点为新节点
self.size += 1 # 链表长度加1
return self.size
def add_at_tail(self, value):
"""在链表尾部添加节点"""
# 创建新节点
node = ListNode(value)
# 如果链表为空,新节点既是头节点也是尾节点
if self.size == 0:
self.head = node
self.tail = node
else:
# 链表不为空时,将新节点插入到尾部
node.prev = self.tail # 新节点的prev指向原尾节点
self.tail.next = node # 原尾节点的next指向新节点
self.tail = node # 更新尾节点为新节点
self.size += 1 # 链表长度加1
return self.size
def peek_at_head(self):
"""查看头节点的值(不删除节点)"""
if self.size == 0:
raise Exception("DoublyLinkedList is empty")
return self.head.val
def peek_at_tail(self):
"""查看尾节点的值(不删除节点)"""
if self.size == 0:
raise Exception("DoublyLinkedList is empty")
return self.tail.val
def pop_at_head(self):
"""删除并返回头节点的值"""
if self.size == 0:
raise Exception("DoublyLinkedList is empty")
# 保存头节点的值用于返回
head_value = self.head.val
# 如果链表中只有一个节点
if self.head == self.tail:
self.head = self.tail = None # 清空链表
else:
# 链表中有多个节点
next_node = self.head.next # 保存头节点的下一个节点
next_node.prev = None # 断开原头节点与后续节点的连接
self.head = next_node # 更新头节点为下一个节点
self.size -= 1 # 链表长度减1
return head_value # 返回被删除节点的值
def pop_at_tail(self):
"""删除并返回尾节点的值"""
if self.size == 0:
raise Exception("DoublyLinkedList is empty")
# 保存尾节点的值用于返回
tail_value = self.tail.val
# 如果链表中只有一个节点
if self.head == self.tail:
self.head = self.tail = None # 清空链表
else:
# 链表中有多个节点
prev_node = self.tail.prev # 保存尾节点的前一个节点
prev_node.next = None # 断开原尾节点与前驱节点的连接
self.tail = prev_node # 更新尾节点为前一个节点
self.size -= 1 # 链表长度减1
return tail_value # 返回被删除节点的值å