前言
链表是一种比较简单的数据结构,你可以在编程环境下轻松写出一个链表,甚至生活中也有很多链表的提现,比如铁链,文章底部的下一篇上一篇都可以称作链表数据结构
描述
链表像铁链一样,一个链节点连着另一个或另两个节点.
在计算机中,一般是每一个节点除了存储自身的信息外,还会存储另一个节点的内存地址,相当于链接到下一个节点,如下图所示
(红色是链表的节点,黑色是被其他数据占用的内存)
可以看到链表可以不按照顺序存,只需要指向下一个地址
特点
1.链表相对于数组,存储同样数量的数据内存占用更高
上面的代码就构成了一个简单的链表结构
可以看到,类中的data字段为存储的数据,而为了用链表存储这个数据需要用Node这个类包装一下,然后设置一个名为next的内存地址指向下一个Node(节点),所以链表比数组多出占用了n个对象-1的内存(数组自身也是一个对象)
2.链表占用的内存可以不连续
每次创建的下一个节点都是实时分配内存的,而且因为每个节点至少都有next来指向下一个内存地址,所以链表不需要连续的内存
3.链表的分类定义
链表的分类定义很简单
只有next节点,并且尾部的next为null(不指向第一个节点)的称为单向不循环链表
有next节点,也有prev(上一个)节点,并且尾部的next为null的称为双向不循环列表
而尾部指向第一个节点的称为单向循环链表或者双向循环链表
且某个节点的next(或prev)链接到了比它靠前的节点,称为死循环链表(是一种错误现象)
4.链表插入和删除比较快
链表的插入和删除只需要修改其前后节点的地址,就可以添加或删除
插入的图示(修改next指向的地址):
在1处插入节点,首先把0的next改为新的,然后把新的的next指向旧的1,就完成了插入
->
移除的图示(修改next指向的地址):
删除1节点,首先把0节点的next指为旧的2,然后就完成了删除,虽然旧的1的next还指向了旧的2,但是没有人指向了旧的1,就可以被gc标识为垃圾
->
5.链表遍历比较慢,插入和删除比较快
链表因为无法直接寻址,所以查询是需要通过遍历的
而双向链表在有算法支持下通常比单向链表更快,但占用稍多内存(每个节点多了一个地址引用)
比如一共10条,我取第3条,就从第一个节点开始向后遍历获取数据,而取第8条就从最后一个节点开始向前遍历
如有错误或补充,请各位大佬指出,我会尽快修改