暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【数据结构】链表

删库跑路小分队 2021-09-03
119



青山不改,绿水长流❤️

后会有期,保持热爱❤️

前程似锦,来日方长❤️

苦尽甘来,不负韶华❤️



你曾说过:我本来是行走江湖的,但是遇见了你我想停一停了


但我想说:江湖太远了,我不去了,我只想留在你身边,给你做饭,陪你睡觉。


今天的话题是

数据结构之链表

(数据结构的浏览量已经直线下降,尴尬)


🌈🌈🌈


先养眼,再看题

❤️

今天还是小姐姐




昨天说的是数据结构的线性表之顺序表

今天就开始讲线性表之链表

tips:其实链表和区块链又有几分相似


[toc]

线性表之链表

1,为什么需要链表

2,链表的定义

3,单向链表

4,结点的实现

5,单链表的操作

6,单链表的实现

    - 1,头部添加元素

    - 2,尾部添加元素

    - 3,指定位置添加元素

    - 4,删除节点

    - 5,查找节点是否存在

7,链表与顺序表的对比

8,单向循环链表

    - 1,操作

    - 2,实现

9,双向链表

    - 1,操作

    - 2,实现




1,为什么要有链表


昨天在讲顺序表的时候,首先有个很明显的特点,就是申请连续存储空间


简单的说:就是需要预先知道数据大小来申请连续存储空间,而在进行扩充时有需要进行数据的搬迁,使用起来不是很灵活

(类似于hive分区表)


链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。




2,链表的定义


链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是不像顺序表一样连续存储数据,而是在每一个节点(数据存放单元)里存放下一个节点的位置信息(即地址)

跟区块链似的,每个阶段都存储链表的上一节的区域信息和下一节的区域信息




3,单向链表


单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域


这个链接指向链表中的
下一个节点,而最后一个节点的链接域则指向一个空值。


- 表元素域elem用来存放具体的数据

链接域next用来存放下一个节点的位置(python中的标识)

变量p指向链表的头节点(首节点)的位置,从p出发能找到表中的任意节点。


4,结点的实现

    class SingleNode(object):
    # 单链表的结点
    def __init__(self,item):
    # item存放数据元素
    self.item = item
    # next是下一个节点的标识
    self.next = None


    5,单链表的操作

        is_empty() 链表是否为空

        length() 链表长度

        travel() 遍历整个链表

        add(item) 链表头部添加元素

        append(item) 链表尾部添加元素

        insert(pos , item) 指定位置添加元素

        remove(item) 删除节点

        search(item) 查找节点是否存在


    6,单链表的实现

        详情看博客,即原文链接




    7,链表和顺序表的对比


    链表失去了顺序表的随机读取的优点,同时链表由于增加了结点的指针域空间开销比较大,但对存储空间的使用要相对灵活


    链表和顺序表的各种操作复杂度如下:

    访问
    链表
    顺序表
    访问原序
    O(n)
    O(1)
    在头部插入/删除
    O(1)
    O(n)
    在尾部插入/删除
    O(n)
    O(1)
    在中间插入/删除
    O(n)
    O(n)

    注意:虽然中间插入/删除的复杂度都是O(n),但是链表和顺序表在插入时进行的是完全不同的操作。


    链表的主要耗时操作是遍历查找,删除和插入操作本身的复杂度是O(1)


    顺序表查找很快,主要耗时的操作是拷贝覆盖

    因为除了目标元素在尾部的特殊情况,顺序表进行插入删除时需要对操作点之后的所有元素进行前后移位操作,只能通过拷贝和覆盖的方法进行。




    8,单向循环链表


    单链表的一个变形是单向循环链表,链表中最后一个节点的next域不再为None,而是指向链表的头节点



    1,操作


    is_empty() 判断链表是否为空

    length() 返回链表的长度

    travel() 遍历

    add(item) 在头部添加一个节点

    append(item) 在尾部添加一个节点

    insert(pos, item) 在指定位置pos添加节点

    remove(item) 删除一个节点

    search(item) 查找节点是否存在



    9,双向链表


    一种更复杂的链表是双向链表或双面链表。


    每个节点有两个链接

    一个指向前一个节点,当前节点为第一个节点时,指向空值;

    而另一个指向下一个节点,当此节点为最后一个节点后,指向空值。




    在此,对于链表的介绍大致如此

    但是由于公众号有限,有很多代码展示和图案都不能很好的展示出来

    也希望大家可以通过打开原文链接进行读取详细内容!


    扫码关注我

    郭大熊的公众号

    个人博客 : www.guodaxiong.com


    如果不曾见过阳光,我本可以忍受黑暗

     Hi GuoDaXiong 



    我是狗子

    祝你幸福

    文章转载自删库跑路小分队,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论