Python數據結構——鏈表

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))

控制檯輸出
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章