在python数据结构中,常用的有序数组为列表,列表的好处很多,使用也很方便。列表在append元素时时间复杂度为O(1),但是在insert时复杂度就很高了,因为其需要先找到要插入的索引位置,这个索引之后的所有数据的索引都会+1,导致较耗时;同理删除某个元素也是。
链表
链表是一种数据结构,对于上面提到的在某个位置插入或删除元素的功能能以O(1)的复杂度完成,但缺点是在寻找元素时复杂度为O(n)。这里简要介绍一下链表:实际上链表就是将一系列有顺序的数据以变量的形式储存在内存中,每个变量的一个next属性为按一定顺序的下一个变量,下一个变量的next属性又链接到下下个变量。这里的next是为了方便理解,实际上设置为其它名字也可以,因为这是我们手动给它加上的属性而已嘛。
比如创建一个a→b→c→d→e的链表,a.next就是b这个变量,b.next就是c这个变量,依次类推。当然由于元素都是各种不同的东西(如数字,字符串甚至列表或者字典等),因此每个变量本身还有自己的一个属性才行,这个属性就是变量本身代表的内容。因此这里的a,b,c,d,e可以是分别代表1,2,3,4,5五个元素的,这种属性值才是数据真实存在的意义所在,通过链表储存就让这些数据变得有顺序且利于管理了。因此根据上面提到的,链表是通过创建非常多个变量来储存表内容的,因此当变量将内存占满后,链表就会崩溃哦(当然这种情况应该不太可能会发生,现在电脑的内存一般都较大了)。
下面的一个图简单展示了一个简单的链表。(keys是指a,b,c,d,e,values是指1,2,3,4,5或者"one",“two”,“three”,“four”,"five"这些分别被a,b,c,d,e储存的值(可以是任何内容,这里展示了数字和字符串)。这里的keys和values是为了方便理解,不要和字典搞混啦。)
链表的基础实现
ok,对链表大致有了解了之后,这里实现一下最基础的链表(链表应该有许多类似列表中的功能,如append,remove等,这里就不加入了,大家可以去看看别人的相对更为完整的实现方式)
# 首先,我们能看到上面每一个链表中的变量都有一个属性值,
# 如果要在代码中的每一行分别对这些所有的变量分别赋值,那么也太麻烦了,
# 因此利用python对象的特性,创建一个节点类,在节点类中定义属性值和next属性的来源就可以了。
# 这样每次创建节点时只需要调用一下这个类即可。
# (这里提到的节点就是上面提到的变量,因为链表是有顺序的一一连接的形式,因此称为节点也较为贴切。)
class Node:
def __init__(self, item):
# item表示某个节点所储存的值
self.item = item
self.next = None # next表示其next属性链接的下个变量,默认为None
# 设计好了节点类之后,就可以开始生成链表啦
# 这里先来一个最简单的链表
a = node(1)
b =