以下为单向链表和单向循环链表的python实现:
class Node():
"""链表节点类,包含链表基本操作。"""
def __init__(self, value):
self.value = value # 节点存储的值
self.next = None # 指向下一个节点的指针,默认为None
def __str__(self):
return str(self.value) # 使得节点对象直接打印时输出其存储的值
def each(self, number=float('inf')):
"""
遍历链表并输出值
### 改进建议:
1. **考虑将遍历链表的方法与打印分离**:目前 `each` 方法既负责遍历链表,又负责打印节点。考虑将遍历链表与节点输出的职责分开。可以设计一个生成器方法用于遍历,另外定义一个方法用于输出节点值,以提高代码的模块性和重用性。
:param number:输出数量,默认全部输出
:return:None
"""
node = self # 从当前节点开始遍历
while node is not None and number:
print(node, end=' ')
node = node.next
number -= 1
print('\n')
class SinglyLinkedList():
"""单向链表类,提供了初始化、添加元素、从左侧弹出元素、以及遍历链表的基本操作。"""
def __init__(self, data_list):
# 初始化方法,通过一个列表 data_list 构建链表
self.head = Node(data_list[0])
pre_node = self.head
for data in data_list[1:]:
node = Node(data)
pre_node.next = node
pre_node = node
self.end = pre_node
def add(self, data):
# 添加元素方法:在链表末尾添加一个新节点
node = Node(data)
self.end.next = node
self.end = node
def pop_left(self):
# 从链表左侧弹出元素(即移除头节点)的方法
return_data = self.head
self.head = self.head.next
return_data.next = None # 断开被移除节点与链表的连接,确保完全移除这个节点
return return_data
def each(self):
# 遍历链表的方法,调用 Node 类的 each 方法打印从头节点开始的所有节点的值
self.head.each()
def circular_decorator(func):
# 循环装饰器,用于确保在执行特定方法后单向链表尾部指向头部,保持循环状态
def wrapper(self, *args, **kwargs):
return_value = func(self, *args, **kwargs) # 执行被装饰的方法
self.end.next = self.head # 确保链表尾部指向头部,形成循环链表
return return_value # 返回被装饰方法的执行结果
return wrapper
class SinglyLinkedCircularList(SinglyLinkedList):
"""单向循环链表"""
@circular_decorator
def __init__(self, data_list):
super().__init__(data_list)
@circular_decorator
def add(self, data):
super().add(data)
@circular_decorator
def pop_left(self):
return super().pop_left()
def each(self):
self.head.each(10) # 只输出10个值,避免陷入无限循环
if __name__ == '__main__':
def print_format(obj):
print('链表:');obj.each()
obj.add(4)
print('结尾添加4后的链表:');obj.each()
print(f'弹出起始值:{obj.pop_left()}')
print('弹出起始值后的链表:');obj.each()
print_format(SinglyLinkedList([1, 2, 3]))
print_format(SinglyLinkedCircularList(data_list=[1, 2, 3]))
输出:
链表:
1 2 3
结尾添加4后的链表:
1 2 3 4
弹出起始值:1
弹出起始值后的链表:
2 3 4
链表:
1 2 3 1 2 3 1 2 3 1
结尾添加4后的链表:
1 2 3 4 1 2 3 4 1 2
弹出起始值:1
弹出起始值后的链表:
2 3 4 2 3 4 2 3 4 2