Python中的list是基於array實現的。但無論是list還是array在數據存儲和操作層面都有一些缺點。例如在插入和刪除元素時都要移動元素,這在數據量旁大時就需要很大開銷。array大小是固定的,無法更改;雖然list是可擴展的,但這也是有其代價的。別忘了list是基於array實現的,這就意味着list的每次擴展都要創建更大的array,然後把原來的array拷貝過來。array需要存儲在連續的內存單元中,無論這個array多大。所以每次創建array都要劃分一塊完整的內存出來。如果這個array很龐大,程序動態分配內存就很難甚至不肯能。
鏈表(linked list)這一數據結構可以解決以上問題。
下面是一個鏈表的實現
用單向鏈表實現一個Bag ADT
class Bag:
#構造一個空bag
def __init__(self):
self._head = None
self._size = 0
# 返回bag大小
def __len__(self):
return self._size
# 查看元素是否在bag中
def __contains__(self, target):
curNode = self._head
while curNode is not None and curNode.item != target:
curNode = curNode.next
return curNode is not None
# 添加一個新元素到bag
def add(self, item):
newNode = _BagListNode(item)
newNode.next = self._head
self._head = newNode
self._size += 1
# 從bag中移除一個元素
def remove(self, item):
predNode = None
curNode = self._head
while curNode is not None and curNode.item != item:
predNode = curNode
curNode = curNode.next
assert curNode is not None, "元素必須存在於bag中"
#斷開連接返回元素
self._size -= 1
if curNode is self._head :
self._head = curNode.next
else :
predNode.next = curNode.next
return curNode.item
def __iter__(self):
return _BagIterator(self._head)
#爲創建鏈表節點定義一個私有存儲類
class _BagListNode(object):
def __init__(self, item):
self.item = item
self.next = None
#使用鏈表實現的一個迭代器
class _BagIterator :
def __init__(self, listHead):
self._curNode = listHead
def __iter__(self):
return self
def next(self):
if self._curNode is None:
raise StopIteration
else:
item = self._curNode.item
self._curNode = self._curNode.next
以下爲該模塊的使用以及控制檯的輸出
bag = Bag()
bag.add(10)
bag.add("china")
bag.add(45)
print(len(bag))
print(45 in bag)
print(len(bag))
bag.remove(10)
print(len(bag))
控制檯輸出