双向链表
双向链表:每一个元素都是一个对象,每个对象有一个关键字key和两个指针:next和prev
在双向链表的实现中,使用一个伪头部(dummy head)和伪尾部(dummy tail)标记界限,这样在添加节点和删除节点的时候就不需要检查相邻的节点是否存在。
- 双向链表:每一个元素都是一个对象(DLinkedNode类的实例),每个对象有一个关键字key和两个指针:next和prev
class DLinkedNode:
def __init__(self, key=0, value=0):
self.key = key
self.value = value #内容区域,可自定义多个字段
self.prev = None
self.next = None # 指针区域 , 双向链表有两个指针
- 双向链表LIST
class DLinkedNodeList:
def __init__(self):
# 使用伪头部和伪尾部节点(更方便不用循环遍历出没有next是尾部)
self.head = DLinkedNode()
self.tail = DLinkedNode()
# 首尾相链
self.head.next = self.tail
self.tail.prev = self.head
# 添加一个新元素在链表尾部
def add_to_tail(node):
# 新增的节点 前后指针赋值
node.prev = self.tail.prev
node.next = self.tail
# 因为是双线链表 新增位置的前一个节点的next 和后一节点的prev 也要链接上
self.tail.prev.next = node
self.tail.prev = node
# 添加一个新元素在链表头部
def add_to_head(node):
node.prev = self.head
node.next = self.head.next
self.head.next.prev = node
self.head.next = node
def remove(node):
# 移除: 只需把前后节点的 next,prev 指针跳过移除的元素 链接
node.next.prev =node.prev
node.prev.next = node.next