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 # 返回被删除节点的值å