数据结构——2、链表
1.1.1 *链表*
1.1.1.1 *内存中的链表结构*
链表是一种在物理上非连续、非顺序的数据结构,由若干node节点组成
链表包括单向链表和双向链表
单向链表包括两部分:存放数据的变量data;指向下一个节点的指针next
链表的第一个节点被称为头结点,最后一个节点被会成为尾节点,尾节点的next指针指向空,结构如下:
双向链表包括三部分:存放数据的data;指向下一个节点的指针next;指向前置节点的指针prev;
数组在内部中是顺序存储,链表在内存中是随机存储,存储如下:
1.1.1.2 *操作节点*
1.1.1.2.1 *查找节点*
链表查找节点,只能从第一个节点开始,一个个向后查找,时间复杂度为O(n)
1.1.1.2.2 *更新节点*
链表的更新像数组一样简单,只需要将旧数据替换成新数据即可
1.1.1.2.3 *插入节点*
链表中元素的插入,不需要像数组一样,还考虑扩容问题,只要内存中还有空间,可以一直插入元素
1、尾部插入:将最后一个节点的next指针指向新插入的节点即可
2、头部插入包括两步:
将新节点的next指针,指向原先的头节点;
将新节点变为链表的头节点
3、中间插入:包括两步:
把插入位置的原前置节点的next指针,指向新节点;
把新节点的next指针,指向原前置节点next指针指向的节点
1.1.1.2.4 *删除节点*
1、 尾部删除:将倒数第2个节点的next指针,指向空
2、 头部删除:将链表的头节点,设置为原头节点next指针指向的节点
3、 中间删除:将删除位置的前置节点的next指针,指向删除位置的下一个节点
java有自动回收机制,没有被引用的节点,会自动被回收
1.1.1.3 *代码实现*
1.1.1.4 *数组和链表比较*
数组和链表的时间复杂度比较如下:
数组适用于读,链表适用于写