最近在看Problem Solving with Algorithms and Data Structures Using Python
看到利用Python 模拟链表。 记录一下
链表(在物理存储单元上非连续、非顺序的数据存储结构)
节点
链表的基本模块是节点,每个节点至少拥有两条信息。首先,节点必须包含本身自有的数据,同时还必须拥有对下一个节点的指向。即在节点类中有两个函数,返回节点数据和引用到下一节点。
class Node:
def __init__(self,initdata):
self.data = initdata
self.next = None
def getData(self):
return self.data
def getNext(self):
return self.next
def setData(self,newdata):
self.data = newdata
def setNext(self,newnext):
self.next = newnext
链表
链表的第一项必须明确指出,即外部指向的第一项通常称为链表的头,同样,链表的最后一项也必须告诉我们已经没有下一个节点了。
class UnorderedList:
def __init__(self):
self.head = None
(图中的地表示链表的end)
链表应该拥有以下函数:
isEmpty() 判断链表是否为空,算法的复杂度为O(1),因为它只要判断self.head 是否为None。
def isEmpty(self):
return self.head == None
serarch(item)判断item是否在链表中,时间复杂度为O(n)。
def search(self,item):
current = self.head
found = False
while current != None and not found:
if current.getData() == item:
found = True
else:
current = current.getNext()
return found
add(item) 将item添加到链表中,add(item)的时间复杂度为O(1),因为只要在链表的头部添加一个新的节点。
def add(self,item):
temp = Node(item)
temp.setNext(self.head)
self.head = temp
列表中的每个元素必定属于一个节点,第二行创建了一个新的节点并将插入的元素作为节点的数据。通过链接这个新的节点与原有的结构来完成插入元素的工作。
第一个步骤(代码4第3 行)是把新插入节点的引用设为原来列表的头节点。由于列表中的其他部分已经和这个新节点正确地连接了,我们可以把列表头部