数据结构特性解析 (三) 链表

前言

链表是一种比较简单的数据结构,你可以在编程环境下轻松写出一个链表,甚至生活中也有很多链表的提现,比如铁链,文章底部的下一篇上一篇都可以称作链表数据结构

描述

链表像铁链一样,一个链节点连着另一个或另两个节点.

在计算机中,一般是每一个节点除了存储自身的信息外,还会存储另一个节点的内存地址,相当于链接到下一个节点,如下图所示

(红色是链表的节点,黑色是被其他数据占用的内存)

可以看到链表可以不按照顺序存,只需要指向下一个地址

特点

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条就从最后一个节点开始向前遍历

如有错误或补充,请各位大佬指出,我会尽快修改

猜你喜欢

转载自blog.csdn.net/qq_33505109/article/details/107045670