关于列表的存储:python
列表开辟的内存空间是一块连续的内存,把这个内存等分红几份(单位是字节),他是连续存储的。
若是一个列表长度已满,再append添加元素的话,会在内存中从新开辟一个2倍的内存空间以存储新元素,原列表内存会被清除。数据结构
链表是一种线性数据结构(与树形结构相对),不是进行连续存储的。
链表中每个元素都是一个对象,每一个对象称为一个节点,包含有数据域key和执行下一个节点的指针next。经过各个节点之间的相互链接,最终串联成一个链表。
一、存储的过程当中,须要先建立节点,而后进行定义。app
# 节点定义: class Node(object): def __init__(self,item): self.item = item # 数据域 self.next = None # 指针域 n1 = Node(1) n2 = Node(2) n3 = Node(3) n1.next = n2 n2.next = n3 # 经过 n1 找到n3的值 print(n1.next.next.item)
只保留头结点,执行第一个位置,剩下的都是next去指定。spa
二、链表遍历:(头节点的变更)指针
def traversal(head): curNode = head # 临时指针,用于指定头节点 while curNode not None: print(curNode.item) # 打印当前节点的值 curNode = curNode.next # 把下一节点赋给临时指针,以做为头节点
三、链表节点的插入和删除操做(很是方便,时间复杂度低)orm
插入:对象
p = Node(5) # 要插入的值 curNode = Node(1) # 标志位 # 顺序不能乱,不然就找不到原链表中的下一个值 p.next = curNode.next # 指定插入值以后的值为标志位以后的值 curNode.next = p # 而后再把原先的链next指向改为插入的值
删除:blog
curNode 表明当前值 p = curNode.next # 表示要删除的数 curNode.next = p.next # 从新指定创建链表 del p 删除数
四、创建链表(单链表)内存
1)头插法:是在head头节点的位置后插入数;获得的链表与原先的列表顺序是相反的。it
def createLinkListF(li): l = Node() # 始终指向头节点 for num in li: s = Node(num) s.next = l.next l.next = s return l
2)尾插法:在链表的尾巴上插入。至关因而追加,必须时刻记住尾巴在哪儿
def createLinkListR(li): l = Node() r = l # r指向尾节点 for num in li: s = Node(num): r.next = s r = s # 从新指定尾节点
双链表中每一个节点有两个指针:一个指向后面节点,一个指向前面节点。
一、节点定义:
class Node(object): def __init__(self,item=None): self.item = item # 记录当前值 self.next = None # 记录下一个值 self.prior = None # 记录前置的一个值
二、双链表节点的插入和删除
curNode = Node(1) # 取一数据做为标志位
1)插入:
p = Node(2) # 要插入的数 p.next = curNode.next # 指定插入数的next 是 当前数的next curNode.next.prior = p # 指定插入数的下一个数的 前置数为当前的数值 p.prior = curNode # 插入数的前置数为 标志位 curNode.next = p # 指定,标志位的next数是当前要插入的数
2)删除:
p = curNode.next # 标志位的下一个数,要删除的数 curNode.next = p.next # 将next指向下一个数 p.next.prior = curNode# 将要删除数的下一个数的前置数改成标志位 del p # 删除当前数
三、创建双链表
尾插法: def createLinkListR(li): l = Node() r = l for num in li: s = Node(num) r.next = s s.prior = r r = s return l,r
循环反转单链表。在循环的方法中,使用pre指向前一个节点,cur指向当前节点,每次把cur->next指向pre便可。
# 建立节点 class Node(object): def __init__(self,item=None,next=None): self.item = item # 数据域 self.next = next # 指针域 # 循环逆置方法 def revLinkList(link): if link is None or link.next is None: return link pre = link # 记录当前节点的值 cur = link.next # 记录下一节点的值 pre.next = None # 先将当前节点的next指向定为None while cur: # 链表中一直有值 tmp = cur.next # 获取cur的下一个值,临时赋值给tmp cur.next = pre # 将cur值指向pre pre = cur # 从新指定 cur = tmp return pre # 把当前值返回 #应用 link = Node(1, Node(2, Node(3, Node(4, Node(5, Node(6, Node(7, Node(8, Node(9))))))))) r = revLinkList(link): # 链表逆置以后,获得的head值 while r: print("{0}---->".format(r.item)) # 输出逆置后的当前值 r = r.next # 获取下一个,从新赋给r,而后交给上边输出