线性结构的python实现(一:单向链表和单向循环链表)

以下为单向链表和单向循环链表的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 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值