限制链接列表中的节点

时间:2017-11-19 04:17:08

标签: 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 = 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,但是将数据相对于另一个更难,对吗?

1 个答案:

答案 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来实现这一切