链表

来源:互联网 发布:matlab 中文论坛 知乎 编辑:程序博客网 时间:2024/05/17 23:58

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

控制台输出
这里写图片描述

0 0
原创粉丝点击