链表的数据结构是程序中最常用的数据结构,是一个具体的数据类型,实现了很多的类型数据的集合
单链表的结构中很容易获的一个项的后继项,不容易获得一个项的前驱项
双链表的结构很容易获得一个项的后继项和前驱项因为它是包含了两个方向的链接
第二个外部的链接叫做尾部链接,它允许双链表的结构的用户直接访问最后的一项
链表的结构反应了项的线性序列,但是使用一个链表结构的程序员无法通过指定的索引位置来立即访问一项,必须从结构的一段开始沿着链表进行,直到达到想访问的位置。链表的内存分配方式和数组的有很大的不同,并且对于插入和删除就有很大的影响,一旦找到插入点和删除点,就可以直接插入和删除,而不需要在内存中移动数据项。
在每次插入和删除数据的过程中,链表结构会调整大小,并且不需额外的内存代价,也不需要复制数据项。
非连续性内存和节点
计算机遵照链表结构中一个给定的项 的位置和地址的链接,就能够在内存中找到它的单元所在何处,这种内存表示方案,叫做非连续性的内存。
链表结构中的基本单位表示的是节点,单链表的节点表示来如下的部分或者字段:
一个数据项
到结构中的下一个节点的链接
双链表中还包含了到结构中的前一个节点的链接
python使用对对象的引用建立了节点和链表的结构,在python中,任何变量都可以引用任何的内容,包含了none值,它意味着一个空的链接,pytohn为每一个新的节点提供了动态分配到非连续内存,并且对象不再被引用的时候,会自动的将内存返回给系统
使用单链表的节点类
节点变量会初始化为一个新的none或者新的node对象
class Node(object):
"""定义链表中的节点类"""
def __init__(self,data,next=None):
self._data=data
self._next=next
node1=None
node2=Node("A",None)
node3=Node("B",node2)
node1没有指向节点的对象
node2和node3指向所链接的对象
node2指向一个对象,其下一个指针为none
单链表的操作是遍历、插入和搜索。遍历在时间上是线性的,并不需要额外的内存,建立一个新的指针
搜索对于单链表的搜索是线性的,和数组不同,链表的结构不支持随机的访问。搜索一个排好好序的链表结构,不能像是搜索一个排好序的数组一样高效
替换替换操作在平均的情况下,也是线性的
在开始和末尾插入都是常数的复杂度,与数组不同
从开始处删除和从末尾的删除,都是线性的
在任何位置的插入和任意位置的删除都是线性的
链表的变体有带哑头节点的循环链表结构也有双链表结构
双链表的结构,比单链表结构的长处:
1、给定的节点,向左移动到前一个节点
2、直接移动到最后一个节点