双向链表:有一个数据域和两个指针域(prev+next)
相比于单向链表,操作更灵活,可进可退,但相应的也会有占用存储空间大,删除操作繁复等缺点。
# 双向链表
class Node(object):
def __init__(self, data):
self.data = data
self.pre = None
self.next = None
# 初始化一个双向链表,包括pre 、 data和next三个属性
class DoubleLink(object):
def __init__(self, node=None):
self.head = node
def is_empty(self):
return self.head is None
# 检查链表是否为空,如为空则返回True
# 判断长度
def length(self):
current_node = self.head
count = 1
while current_node.next is not None:
count += 1
current_node = current_node.next
return count
# 打印数据
def travel(self):
current_node = self.head
count = 1
while current_node.next is not None:
print(current_node.data, end='')
count += 1
current_node = current_node.next
print(current_node.data)
print(end='\n')
# 数据检索
def search(self, data):
current_node = self.head
while current_node.next is not None:
if data == current_node.data:
return True
current_node = current_node.next
return False
# 在链表最前端添加节点
def add_data(self, data):
add_node = Node(data)
add_node.next = self.head
if add_node.next is not None:
self.head.pre = add_node
self.head = add_node
# 在链表尾部添加节点
def append_data(self, data):
add_node = Node(data)
current_node = self.head
# 判断链表是否为空,若不为空,将待添加节点的pre指向原尾节点,原尾节点的next指向待添加节点
if self.head is None:
self.head = add_node
else:
while current_node.next is not None:
current_node = current_node.next
current_node.next = add_node
add_node.pre = current_node
# 插入节点
def insert_data(self, data, item_id):
add_node = Node(data)
current_node = self.head
count = 1
while count <= item_id:
if count == item_id:
if count != 1 and current_node.next is not None:
add_node.next = current_node
add_node.pre = current_node.pre
current_node.pre.next = add_node
current_node.pre = add_node
elif count == 1:
self.head.pre = add_node
add_node.next = self.head
self.head = add_node
elif current_node.next is None:
current_node.next = add_node
add_node.pre = current_node
current_node = current_node.next
count += 1
# 删除节点
def remove(self, item_id):
current_node = self.head
count = 1
if item_id == 1:
self.head = current_node.next
current_node.next.pre = None
elif item_id == self.length():
while current_node.next is not None:
current_node = current_node.next
current_node.pre.next = None
else:
while current_node.next is not None:
if count == item_id:
current_node.pre.next = current_node.next
current_node.next.pre = current_node.pre
current_node = current_node.next
count += 1