一、链表
【链表的定义】
链表是由一系列节点组成的元素集合。每个节点包含两部分,数据域item和指向下一个节点的指针next。通过节点之间的互相连接,最终串联成一个链表。
class Node(object):
def __init__(self,item):
self.item=item
self.next=None
a=Node(1)
b=Node(2)
c=Node(3)
a.next=b
b.next=c
print(a.next.item) #2
print(a.next.next.item) #3
【创建链表与链表的遍历】
1.头插法
头节点顾名思义就是第一个数,图中86就是头节点。
头插法就是在头节点的位置上再插入一个数,再将新的数表示为头节点。
当新进来一个3,然后将3指向head,与head连接(node.next=head)箭头方向是next下一跳,再将head值移动到3上head=node。
==》
==》
【代码】
class Node(object):
def __init__(self,item):
self.item=item
self.next=None
#头插入
def create_linklist_head(li):
head=Node(li[0])#头节点
for element in li[1:]:
node=Node(element)#新加入的数
node.next=head #将head赋值给上一个节点
head=node#再将新加入的数赋值为head
return head
lk=create_linklist_head([1,2,3,4])
print(lk.item) #4
print(lk.next.item) #3
#遍历链表输出
def print_linklist(lk):
while lk:#当链表不为空
print(lk.item,end=' ')
lk=lk.next
print_linklist(lk)#4 3 2 1
2.尾插法
不光要知道头在哪,也要知道尾巴在哪,所以需要确定头和尾,输入一个3,将tail指向3,然后再将3赋值给tail
==》
==》
class Node(object):
def __init__(self,item):
self.item=item
self.next=None
#尾插法
def create_linklist_tail(li):
head=Node(li[0])#确认头节点
tail=head #一开始尾节点是与头节点相同的
for element in li[1:]:
node=Node(element)
tail.next=node #将尾节点和新的数连起来(node是尾节点的下一跳)
tail=node #再将新加入的数定义为尾节点
return head
lk=create_linklist_tail([1,2,3,4])
print(lk.item)#1
print(lk.next.item)#2
##遍历链表输出
def print_linklist(lk):
while lk:#当链表不为空
print(lk.item,end=' ')
lk=lk.next
print_linklist(lk)#1 2 3 4
【链表节点的插入】
首先讨论列表的插入操作复杂度问题:O(n)
链表的插入操作则是将某一处剪开即可
假设现在有一个数p要加入到链表1和2中间,应该如何操作呢?
【图解步骤】
1.首先需要将后一个数与新加入的数相连,即先4与2连接(p.next=curNode.next),curNode当前指向的是元素1。
2.再将前一个数与需要加进来的数连接,即1与4相连(curNode.next=p)
p.next=curNode.next
curNode.next=p
【链表节点的删除】
要删除p这个节点,首先要将1和2连起来,然后删除p这个节点即可
curNode.next=curNode.next.next
#或者
p=curNode.next
curNode.next=p.next
del p
二、双链表
【双链表的定义】
对单链表进行优化——方便后面从前查找
双链表对每个节点有两个指针:一个指向后一个节点,另一个指向前一个节点
比链表多了一个向前指向的方法
class Node(object):
def __init__(self,item=None):
self.item=item
self.next=None #指向后面
self.prior=None #指向前面
【双链表节点的插入】
当想把p等于2这个元素插入到1和3之间时的操作
【图解】
跟单链表相似,先是连后面那个,再是连前面那个
1.先将p等于2的下一跳指向3(p.next=curNoed.next)
2.第一步已经将2指向3,所以还得往回连,即3的前面是2(curNode.next.prior=p)
3.第三步就是curNode和p连(p.prior=curNode)
4.第四步同第三步,往回连(curNode.next=p)
【具体步骤】
p.next=curNode.next#将p连接3
curNode.next.pripr=p#将3连接p
p.prior=curNode #将p连接1
curNode.next=p #将1连接p
【双链表节点的删除】
1.首先将p定义为curNode的下一跳,将p的下一跳定义到curNode的下一跳
(curNode.next=p.next)
2.将p下一跳的节点的前一跳定义为curNode
(p.next.prior=curNode)
3.最后删除p (del p)
p=curNode.next#将p定义为curNode的下一点
curNode.next=p.next
p.next.prior=curNode
del p