一:链表基础知识
1.基础知识
2.代码实现
2.1单链表
类定义链表---链表有节点和连接线表示---节点:节点类; 连接线,指针(引用数据,node next)
(1)单链表实现
节点类:
链表类:
链表类与节点类是整体与部分的关系
(2)头插法
head为新节点,新节点的值为value(插入值),节点的引用(第二个属性)为原来的head节点。
(3)链表遍历
方法一:
具体的操作由循环内转移到调用方
(通过Consumer参数)
方法二:
方法三:迭代器
小技巧:类是否能加static限制
(4)尾插法
先要查找到尾部节点--查找节点方法
再尾部添加
(5)get:根据索引获取值
(6)索引位置添加元素
先找到索引减一的节点---创建新节点---新节点对上对下连接
(7)删除节点
删除头节点
先找到i-1个节点(pre)
pre的next指向第i个节点的next
2.2带哨兵的单链表
上述方法对于空链表需要特殊处理,添加哨兵节点,链表非空,找上一个节点都可以找到
头指针head不指向第一个元素,而是指向哨兵
(1)链表构造
头指针指向null,链表为空
带哨兵,头指针指向一个节点,节点值随意,节点next开始为null,没有任何数据
(2)功能
可以全部删除,链表为空(head=null)的判断
2.3带哨兵的双向链表
单链表:一个指针,指向后节点;一个head指向一个哨兵
双向链表:两个指针,指向后节点,前节点;一个head,一个tail指向2个哨兵
(1)链表实现
(2)根据索引查找节点
最后一个数据节点指向尾节点tail
(3)增删
新增:修改4个指针
删除:修改2个指针
哨兵节点也删掉了,空链表不能再删了
2.4循环链表(环形链表)
双向链表:两边是开的
循环链表:两边是闭合的
单向循环链表:只有一个next指针,没有pre指针
(1)链表实现
节点类:前后两个指针