Python数据结构之链表

链表

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。
——————————————百度百科——————————————————

节点

链表由节点组成,每个节点至少都由“值”和“指针”两种东西组成,节点在python中用类来实现。

class Node:
    def __init__(self):
        self.value=0
        self.next=None

Node就是我们定义的类。

类是什么呢?打个比方,我们要做冰淇淋,可以先做一个冰淇淋的模子,这样的话,就可以方便批量生产同样的冰淇淋。

我们想要实现的对象就是冰淇淋,而类就是这个模子。

我们通过实例化这个类来实现这个节点(对象):

node=Node()

类后面加一个括号就是一个实例(节点)

这个实例刚被创建就有2个属性:value 和 next。这是初始化函数init的作用。而且init函数不用手动调用,程序会自动调用。

单向链表

节点有了,我们只需要将这些节点依此连接起来就形成了单向链表:

node.next=newnode

这样,node这个对象的指针就指向了newnode,通过指针我们就可以访问新节点的值,以此类推,可以继续添加节点到链表中。

举例:用单向链表存储狮子狗落地秒连招:‘r’,‘q’,‘e’,‘w’,‘q’。

class Node:
    def __init__(self):
        self.value=0
        self.next=None

head=Node()
ptr=head
for i in 'rqewq':
    node=Node()
    node.value=i
    ptr.next=node
    ptr=node

head 是头节点,也是链表的开头,可以赋值也可以不赋值。(就像是耳机线的头,找到了头才方便把耳机线撸顺。)

ptr指定当前节点。

链表的遍历

有了头节点,很容易遍历链表

ptr = head.next
while ptr!=None:
    print(ptr.value)
    ptr=ptr.next

链表的插入和删除

有人说,狮子狗一般要出提玛亚特,在w后加上一个提玛亚特的操作会打出更高的伤害,我们需要在w后加上一个节点,节点的值为‘提玛亚特’。

ptr=head
while ptr.value != 'w':
    ptr=ptr.next
node=Node()
node.value='提玛亚特'
#旧指针断开
node.next=ptr.next
#新指针连接
ptr.next=node

#打印,观察效果
ptr = head.next
while ptr!=None:
    print(ptr.value)
    ptr=ptr.next

又有人说,我就不喜欢出提玛亚特,你要把这个删除了
真麻烦。

ptr=head
while ptr.value != '提玛亚特':
    pttr=ptr
    ptr=ptr.next
#现在pttr指向的节点的下一个节点的值就是‘提玛亚特’
#将pttr指向ptr指向的节点
pttr.next=ptr.next

#打印,观察效果
ptr = head.next
while ptr!=None:
    print(ptr.value)
    ptr=ptr.next

双向链表

有人说,单向链表只能一个方向遍历,我想要反向查找值。
简单,在定义类的时候,可以多加一个属性

class Node:
    def __init__(self):
        self.value=0
        self.left=None
        self.right=None

然后左指针指向左节点,右指针指向右节点(或没有右节点时,指向None)

环形链表

有人说,可不可以从任何一个节点开始都能遍历链表呢?
只需要将链表最后一个指向头节点就行啦!(原本会指向None)

#假设node是最后一个节点
node.next=head

更多详细代码
请点这里

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值