Python 限制链接列表中的节点

Python 限制链接列表中的节点,python,linked-list,queue,heap,Python,Linked List,Queue,Heap,是否可以限制保存在链表中的节点 为简单起见,请以下面的示例为例: 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 = Link

是否可以限制保存在链表中的节点

为简单起见,请以下面的示例为例:

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%

我想我有两个问题。首先,如何解决上述问题,保持链表方法。第二,有没有更好的方法不使用链表。我想我可以使用一个有限制的queue/deque或heapq,但是要获得与另一个相关的数据会有点困难,对吗

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之类的操作来解决此问题,或者只使用内置的使所有这一切变得轻而易举的方法来解决此问题

您的问题并不清楚:如果您想限制列表中的节点数,当然可以这样做,如何实现它取决于您:如果它已满,您可以忽略添加新节点的请求,删除最旧的节点,等等。如果您想控制内存中的内容和不在内存中的内容,那么在Python中它是不可行的,但即使它会,也没有任何意义。如果您想在较低级别上工作,请使用较低级别的语言。您是否有真正的理由提出这样的要求?您是否对应用程序进行了基准测试,测量了使用的内存,并发现这是一个瓶颈?链表不是一个很好的数据结构。这是可行的,但你可能正在寻找一个新的链接。我如何从链接列表中“删除”最老的链接?我没有进行基准测试,但我可以看到运行程序时使用的内存高达4GB。这是一个编程游戏,我试图实现机器学习。没有必要保留很多次之前的非常旧的输入数据,这就是我希望限制保留的节点的原因。没有必要,它仍然有效,只是想知道它是否可能。好的,谢谢你给我展示了一个可能的实现。但我想链表并不是解决这个问题的好办法。再次感谢