是否可以限制保存在链表中的节点?
为简单起见,请采用以下示例:
import numpy as np
class LinkedList():
def __init__(self,data,prev):
self.data = data
self.prev = prev
myData_prev = None
for x in range(10):
data = np.random.random((3,2))
myData = LinkedList(data,myData_prev)
myData_prev = myData
print(myData.data)
print(myData.prev.data)
print(myData.prev.prev.data)
print(myData.prev.prev.prev.data) ## DELETED OR NO LONGER AVAILABLE
假装'数据'非常大或范围是无限的。是否可以限制保留在内存中的节点?为简单起见,我说只需要最新的3个节点或30%。
我想我有2个问题。首先,如何完成上述问题,保持链表方法。其次,有没有更好的方法不使用链表。我想我可以使用带有限制的queue / deque或heapq,但是将数据相对于另一个更难,对吗?
答案 0 :(得分:1)
class Node:
def __init__(self, data=None, next=None):
self.data = data
self.next = next
def __repr__(self):
return 'Node({}, {})'.format(self.data, self.next)
class LinkedList:
def __init__(self, iterable=(), maxlen=3):
self.head = None
self.length = 0
if maxlen < 2:
raise ValueError
self.maxlen = maxlen
for item in iterable:
self.add(item)
def add(self, data):
self._check_and_remove_last()
self.head = Node(data, self.head)
self.length += 1
def _check_and_remove_last(self):
if self.length < self.maxlen:
return
new_tail = self.head
while new_tail.next.next:
new_tail = new_tail.next
# new_tail.next is now the last Node in the Linked List
new_tail.next = None
self.length -= 1
删除链表的最后一个元素意味着你要么必须跟踪链表中的倒数第二个节点(这不是很自然的事情),要么每次遍历整个链表。您可以通过使用双向链接列表并执行self.tail.prev.next = None
之类的操作来解决此问题,或者只使用内置的deque
来实现这一切