您的位置:首页 > 理论基础 > 数据结构算法

Python数据结构——链表

2016-10-22 10:47 519 查看
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))


控制台输出

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: