python单链表写的LRU淘汰策略

单链表写出的lru淘汰策略,貌似惨不忍睹,记录下待重构

class Node(object):

    def __init__(self, value=None, next=None):
        self.value = value
        self.next = next


class SingleLink(object):

    def __init__(self, size=4):
        self.head = Node()
        self.size = size
        print(f"——————当前空间长度{size},超过长度自动lru淘汰:")
        self.count = 0

    def is_empty(self):
        return False if (self.head and self.head.value) else True

    def add(self, value):
        new_node = Node(value)
        if self.is_empty():
            self.head = new_node
            self.count += 1
            return True
        elif self.head.value == new_node.value:
                """新数据缓存已经在头节点,不需要操作"""
                return True
        elif self.has_value(value):
            """O(3n)数据已存在缓存中,移除当前节点,在头节点前插入数据"""
            self.move(value)
        elif self.count < self.size:
            """链表未满,在头结点前插入数据"""
            self.insert(new_node)
        else:
            """链表满,移除尾节点,在头结点前插入数据"""
            self.remove()
            self.insert(new_node)

    def has_value(self, value):
        current = self.head
        while current:
            if current.value == value:
                return True
            else:
                current = current.next
        return False

    def insert(self, new_node):
        new_node.next = self.head
        self.head = new_node
        self.count += 1

    def move(self, value):
        """O(2n)"""
        current = self.head
        move_index = 0
        while current:
            if current.value == value:
                break
            else:
                move_index += 1
                current = current.next
        current = self.head
        index = 1
        while current:
            if index == move_index:
                new_node = Node(current.next.value)
                current.next = current.next.next
                new_node.next = self.head
                self.head = new_node
                break
            else:
                current = current.next
                index += 1

    def remove(self):
        current = self.head
        index = 1
        while current:
            if index == (self.size-1):
                current.next = None
                self.count -= 1
                break
            else:
                current = current.next
                index += 1

    def travel(self):
        if not self.is_empty():
            current = self.head
            length = ""
            while current.next:
                length += str(current.value)+" "
                current = current.next
            length += str(current.value)
            return length

if __name__ == '__main__':
    list = SingleLink()
    list.add(1)
    list.add(2)
    list.add(3)
    list.add(4)
    print(f"\n——————当前链表:{list.travel()}")
    message = ''
    while message != 'q':
        print('''
          ************************************************************************************************************
          **********************************************请选择相应的序号完成相应的操作*************************************
          ************************************************************************************************************   
          **         q、退出操作!!!!!!                                                                           ***
          **         1、使用数据!                                                                                   ***
          ************************************************************************************************************
          ''')
        message = input('——————输入下一步要进行的相应操作序号——————:')
        if message == 'q':
            break
        print(f"——————操作前链表数据:{list.travel()}" )
        if message == '1':
            value = input('——————请输入要使用的数据:')
            list.add(value)
        print(f"——————操作后链表数据:{list.travel()}")

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值