链表

作者: 牛牛_735d | 来源:发表于2019-12-22 23:21 被阅读0次
链表
链表: 用指针将一组零散的内存块串联在一起、其中: 把内存块称为链表的节点
为了将节点串联起来、每个链表的节点除了存储数据、还需要记录链上的下一个节点的地址(后继指针)

分为:单链表、双链表和循环链表

其中: 第一个节点称为头节点(用来记录链表的基地址)、最后一个节点称为尾节点、

单链表的尾节点指向一个空地址NULL、
循环链表: 一种特殊的单链表、与单链表的区别是: 尾节点指向链表的头节点
双向链表: 每个节点有一个后继指针next和一个前驱指针prev

存储相同的数据、双向链表要占据两个额外的空间来存储prev和next指针、需要更多的空间、但也带来了双向链表操作的灵活性

一个重要思想:
空间换时间: 在内存充足的时候、若追求代码的执行速度、可以利用空间换时间、选择空间复杂度高、但时间复杂度相对较低的算法
相反: 若内存较少、eg. 代码跑在单片机或者手机上、就需要考虑时间换空间的思路

链表vs数组
1. 链表可有效使用内存、插入和删除效率较高
2. 数组随机访问效率更高、插入删除效率较低
3. 数组的连续存储性、可借助CPU的缓存机制、预读数组中数据、访问效率更高
   链表存储非连续、对CPU缓存支持不够友好
4. 数组大小固定、一旦声明就要占用整块的连续空间、若声明的数组过大、系统无足够连续内存、会导致OOM、链表本身无大小限制、可天然支持动态扩容
5. 若代码对内存要求很高、则数组更合适、且: 对链表频繁的增删会导致频繁的内存申请和释放、容易造成GC

几个写链表代码的技巧
一、理解指针或者引用的含义
   将某个变量赋值给指针、实际上就是将这个变量的地址赋值给指针、即: 指针中存储了这个变量的内存地址、指向了这个变量、通过指针就能找到这个变量

二、警惕指针丢失和内存泄漏
   插入节点时需要注意操作顺序、删除节点时也要手动释放内存

三、利用哨兵简化实现难度
   针对链表的增删操作、需要对头节点和尾节点进行特殊处理

四、留意边界条件
   1. 空链表能否正常工作 ?
   2. 只有一个节点的链表能否正常工作 ?
   3. 只有两个节点能否正常工作 ?
   4. 处理头尾节点时能否正常工作 ?

五、举例画图、辅助思考

六、多写多练

相关文章

  • 链表基础

    链表基础 链表长度 链表为空 链表结构 链表增加

  • 双向链表&双向循环链表

    链表分为:单链表、单向循环链表、双向链表、双向循环链表本节主要说明:双向链表、双向循环链表 定义结点 一、双向链表...

  • 算法与数据结构:链表

    链表 链表还分为单向链表和双向链表, 但是这篇文章只说单向链表 , 下次再讲双向链表 . 链表和数组的区别 ? 链...

  • 链表

    链表 单链表反转链表中环的检测两个有序链表合并删除链表倒数第n个节点求链表的元素总个数 一.单向链表 链表共有特征...

  • 五、双向链表

    双向链表 此前介绍的链表,也叫做单向链表使用双向链表可以提升链表的综合性能 修改之前的单链表的源码: 双向链表 –...

  • 链表

    内容 链表数据结构 向链表添加元素 从链表移除元素 使用 LinkedList 表 双向链表 循环链表 链表数据结...

  • 数据与算法结构

    线性表 顺序表 链表(物理上离散,逻辑上连续) 链表的类别 单链表 循环链表 双链表 链表的操作 顺序表与链表的比...

  • 数据结构——链表

    本文所讲的链表是单链表,链表采用无头链表 科普下:一般链表可以分为有头节点的链表与无头节点的链表 有头节点的链表:...

  • 链表

    文章结构 链表的定义 链表的插入和删除操作 链表的特性 常见的链表结构 自定义链表 链表的经典操作 使用链表实现L...

  • Algorithm小白入门 -- 单链表

    单链表递归反转链表k个一组反转链表回文链表 1. 递归反转链表 单链表节点的结构如下: 1.1 递归反转整个单链表...

网友评论

      本文标题:链表

      本文链接:https://www.haomeiwen.com/subject/vfpanctx.html