zoukankan      html  css  js  c++  java
  • 链表

    链表是数据结构之一,其中的数据呈线性排列。在链表中进行数据的添加和删除都比较方便,就是访问比较耗时间。

    1、单链表

     

    • Blue、Yellow、Red这3个字符作为数据存储于链表中。每个数据都有一个指针,它指向下一个数据的内存地址。Red是最后一个数据,所以Red的指针不指向任何位置。
    • 链表中的数据一般是分散存储于内存中,无须存储在连续内存空间。

    (1)数据查询。因为数据是分散存储的,所以想要访问数据,只能从第1个数据开始,顺着指针的指向一一往下访问(顺序访问),比如像找到Red这个数据,就需要从Bule开始访问。然后经过Yellow,最后才能找到Red。

    (2)添加数据。如果想要添加数据,只需要改变添加位置前后的指针即可,非常简单。比如在Blue与Yellow直接添加Green。首先将Blue的指针指向位置变成Green,然后将Green的指针指向Yellow,数据的添加就完成了。

     

    (3)删除数据。数据的删除也是一样的,只要改变指针的指向就可以,比如删除Yellow。只需要将Green的指针指向位置变成Red,删除就完成了。虽然Yellow还存在内存中,但是不论从哪里都无法访问这个数据了,所以不用特意去删除它。如果后面需要用到Yellow所在的存储空间,只需要用新数据覆盖就可以了。

    • 将链表中的数据量记成n,访问数据时需要从链表头部进行查找(线性查找),如果目标数据在链表的最后,需要的时间是O(n)。
    • 添加数据只需要更改两个指针的指向,所以耗时与n无关。如果已经到达了添加数据的位置,那么添加操作只需要花费O(1)时间,删除操作也是只需要O(1)时间。

    2、循环链表

    除了单链表以外还有其他链表。比如可以在链表尾部使用指针,并且让它指向链表的头部的数据,将链表变成环形,这种是“循环链表”,循环链表没有头尾的概念,如果要保存数量固定的最新数据时需要使用这种链表。

     

    3、双向链表

    单链表的每个数据都只有一个指针,但可以将指针设定为2个,并且让它们分别指向前后数据,这就是“双向链表”,使用这种链表,不仅可以从前往后,还可以从后往前遍历数据非常方便。

    但是双向链表有两个缺点:一是指针数量增加会导致增加存储空间;二是添加和删除数据时需要改变更多指针的指向。

    欢迎批评指正,提出问题,谢谢!
  • 相关阅读:
    (error) DENIED Redis is running in protected mode because protected mode is enabled
    boost库安装和使用
    linux下Redis以及c++操作
    Redis 客户端安装与远程连接图解
    Redis 安装和配置
    terminate called after throwing an instance of 'std::out_of_range' what(): basic_string::substr
    C++ STL std::wstring_convert处理UTF8
    C++正确的cin输入
    分词之最短编辑距离算法实现(包括中文)
    unicode和utf-8互转
  • 原文地址:https://www.cnblogs.com/xxeleanor/p/14460824.html
Copyright © 2011-2022 走看看