链表
单向链表
抽象类(包含边界检查等公共方法)
删除链表中的结点
虚拟头结点
虚拟头结点可以使0结点与其它节点统一处理,用作哨兵结点。
哨兵节点,也是头结点,是一个 dummy node. 可以用来简化边界条件,是一个附加的链表节点.该节点作为第一个节点,它的值域不存储任何东西,只是为了操作的方便而引入的。
如果一个链表有哨兵节点的话,那么线性表的第一个元素应该是链表的第二个节点.
使用情况
在很多时候,我们处理某个节点需要用到它的前驱节点。比如删除链表的某个节点,对于没有哨兵的单链表,当待删除的节点为链表的第一个节点,,由于没有前驱,需要进行特殊处理。从而代码的复杂性增加。而如有哨兵节点,则第一个节点的处理方式与其他节点相同,可以统一进行处理。
三种形式复杂度分析
动态数组add(带索引和元素)复杂度分析
动态数组add(参数只有元素)复杂度分析
此时是向数组末尾添加,涉及扩容问题,适合使用均摊复杂度
双向链表(在单向链表设计的基础上修改)
clear后不需要删除中间元素引用,因为非gc root对象会被jvm自动回收
双向链表与单向链表对比
双向链表官方clear
单向循环链表设计
双向循环链表设计
约瑟夫问题
循环退出问题