双向循环链表
class Node:
#显性定义出构造函数
def __init__(self,data):
self.data = data #普通节点的数据域
self.next = None #保存下一个节点的链接域
self.prior = None #保存前一个节点饿链接域
class DoubleLinkLoop:
def __init__(self, node = Node):
self.head = node
self.size = 0
# 判空
def is_empty(self):
return self.size == 0
# 尾插
def add_tail(self,data):
node = Node(data)
# 判空
if self.is_empty():
self.head = node
node.next = node
node.prior = node
else:
q = self.head
while q.next != self.head:
q = q.next
q.next = node
node.prioe = q
node.next = self.head
self.head.prior = node
self.size += 1
# 遍历
def show(self):
if self.is_empty():
print("链表为空,无法遍历")
return
q = self.head
while True:
print(q.data, end=" ")
q = q.next
if q == self.head: # 遇到头节点结束循环
break
print()
# 尾删
def del_tial(self):
if self.is_empty():
print("删除失败")
return
else:
if self.size == 1:
self.head = None
else:
q = self.head
i = 1
while i < self.size - 1:
q = q.next
i += 1
q.next = self.head
self.head.prior = q
self.size -= 1
# 测试
if __name__ == "__main__":
doubleLinkLoop = DoubleLinkLoop()
# 尾插
doubleLinkLoop.add_tail(10)
doubleLinkLoop.add_tail(20)
doubleLinkLoop.add_tail(30)
doubleLinkLoop.add_tail(40)
# 遍历
doubleLinkLoop.show()
# 尾删
doubleLinkLoop.del_tial()
doubleLinkLoop.show()
链式栈
class Node:
"""定义链式栈的节点"""
def __init__(self, data=None):
self.data = data # 节点存储的数据
self.next = None # 指向下一个节点
class LinkedStack:
"""链式栈的实现"""
def __init__(self):
self.top = None # 栈顶指针
self.size = 0 # 栈的大小
def is_empty(self):
"""判断栈是否为空"""
return self.top is None
def push(self, data):
"""添加数据到栈顶"""
new_node = Node(data)
new_node.next = self.top # 新节点指向当前栈顶
self.top = new_node # 更新栈顶为新节点
self.size += 1
def pop(self):
"""弹出栈顶元素"""
if self.is_empty():
raise IndexError("pop from an empty stack")
popped_data = self.top.data
self.top = self.top.next # 栈顶指针下移
self.size -= 1
return popped_data
def peek(self):
"""返回栈顶元素"""
if self.is_empty():
raise IndexError("peek from an empty stack")
return self.top.data
def traverse(self):
"""遍历栈中的所有元素"""
elements = []
current = self.top
while current:
elements.append(current.data)
current = current.next
return elements
def get_size(self):
"""返回栈的大小"""
return self.size
测试
stack = LinkedStack()
# 添加数据
stack.push(10)
stack.push(20)
stack.push(30)
print("栈中的元素:", stack.traverse()) # 输出: [30, 20, 10]
print("栈顶元素:", stack.peek()) # 输出: 30
print("栈的大小:", stack.get_size()) # 输出: 3
# 弹出栈顶元素
print("弹出栈顶:", stack.pop()) # 输出: 30
print("栈中的元素:", stack.traverse()) # 输出: [20, 10]
# 判空
print("栈是否为空:", stack.is_empty()) # 输出: False
# 清空栈后判空
stack.pop()
stack.pop()
print("栈是否为空:", stack.is_empty()) # 输出: True
思维导图