限制链表中的节点
Limit the nodes in a linked list
是否可以限制链表中保存的节点数?
为简单起见,请看下面的例子:
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
假装 'data' 相当大或范围不确定。是否可以限制保存在内存中的节点?为简单起见,假设我只需要最新的 3 个节点或 30%。
我想我有 2 个问题。首先,如何才能完成上述问题,维护链表方法。其次,有没有更好的方法不使用链表。我想我可以使用有限制的 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
之类的操作来解决此问题,或者仅使用内置的 deque
使这一切变得轻而易举
是否可以限制链表中保存的节点数?
为简单起见,请看下面的例子:
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
假装 'data' 相当大或范围不确定。是否可以限制保存在内存中的节点?为简单起见,假设我只需要最新的 3 个节点或 30%。
我想我有 2 个问题。首先,如何才能完成上述问题,维护链表方法。其次,有没有更好的方法不使用链表。我想我可以使用有限制的 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
之类的操作来解决此问题,或者仅使用内置的 deque
使这一切变得轻而易举