Python算法入门day8——链表

一、链表

【链表的定义】

链表是由一系列节点组成的元素集合。每个节点包含两部分,数据域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

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值