单链表写出的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()}")