结合JDK看链表实现
一、概念
链表是一种线性数据结构,由节点对象构成,节点包含链表存储的数据以及指向其他节点的链接。
<假装这里有一张链表的图片>
1.1、节点

1.1.1、属性
1.1.1.1、数据元素
根据需要定义,这里使用的是范型。
1.1.1.2、链接
对于单向链表,一般把链接的指针字段称为next。
1.1.2、构造函数
构造函数定义了两个形参,一个表示节点要存储的数据,另一个是指向下一个节点的链接。
1.1.3、其他
在链表的实现中,节点一般定义为内部类,至于为什么,我想可能是不同数据结构的节点定义会不同,放到外面就太多了,并且使用者关注的是数据结构的应用,可以不知道节点的定义。
1.2、链表
1.2.1、属性
1.2.1.1、链表大小
集合的大小一般定义为size,size作为集合的重要属性,在很多地方会使用,初始化的时候大小为0,随着集合元素数量变化而变化.
1.2.1.2、哨兵
有时候为了避免复杂重复的判空及头尾节点判断,会给链表增加哨兵。
比如在新增的时候,如果没有哨兵就要判断链表是否为空,如果原链表为空,直接新增节点作为头节点;
如果原链表不为空,还要判断插入位置是否在头部...等等,判断很是复杂,
如果有哨兵节点,只要找到preNode就可以了,将preNode原来的next链接到新节点后,将新节点链接到preNode后。
1.2.2、方法
1.2.2.0、Index检测
链表中有很多地方需要检测index,所以对这个方法做单独封装。
1.2.2.1、新增
对于有哨兵的链表,新增节点是先获取preNode,然后将新节点链接到preNode的next。
一般会创建几个新增方法:addFirst(E e)、addLast(E e)、add(int index, E e)
1.2.2.2、删除
对于有哨兵的链表,节点是先获取preNode,然后将下下个节点链接到preNode的next。
一般会创建几个删除方法:removeFirst()、removeLast()、remove(int index)
1.2.2.3、查找
从链表头逐个查找。
一般会创建几个查找方法:getFirst()、getLast()、get(int index)
1.2.2.4、遍历
链表作为一种集合一般会实现Iterable接口,待完善。
1.3、双向链表
1.3.1、双向链表节点
对比单向链表,在节点的属性中多了一个指向上一个节点的链接,另外构造函数也要加上上一个节点。
private static class Node<E> { E item; Node<E> next; Node<E> prev; Node(Node<E> prev, E element, Node<E> next) { this.item = element; this.next = next; this.prev = prev; } }
1.3.2、双向链表

浙公网安备 33010602011771号