package one.Two.List; import java.util.Iterator; import java.util.linkedList; @SuppressWarnings({"all"}) public class linkedListCRUD { public static void main(String[] args) { linkedList linkedList = new linkedList(); linkedList.add(1); linkedList.add(2); linkedList.add(3); System.out.println(linkedList); //[1,2,3] //演示一个删除结点 linkedList.remove(); System.out.println(linkedList);//[2,3] //修改某个结点对象 linkedList.set(1,999);//[2,999] 下标 从0开始 System.out.println(linkedList); //得到某个结点对象 //get(1)是得到双向链表中的第二个对象 Object o = linkedList.get(1); System.out.println(o);//999 //因为linkedList是实现了 List接口,遍历方式可以迭代器 for Iterator iterator = linkedList.iterator(); while (iterator.hasNext()) { Object o1 = iterator.next(); System.out.println(o1); } for (Object o1 :linkedList) { System.out.println(o1); } //普通for循环要看具体的实现类有没有size()方法,有就可以使用 for (int i = 0; i一、
1.起初first/last 都是空。
2.然后执行add方法: 源码实际上调用的是linkLast()方法,顾名思义把添加的对象直接放到最后,起初只有添加的一个“1”,也就是只有一个结点,first/last都指向这一个结点。
3.首先把last给到一个l,l→空,然后他new了一个新的结点,把“1”放入,此时新的结点prev为空,next为空,last指向该结点,然后下面的if语句l为空,然后first也指向该结点,以及newNode也指向该结点。
4.若加入linkedList.add(2),首先如上述,first/last皆指向第一个结点,即prev = null ; item =1 ; next = null。
5.此时l = last 也就是l也指向该结点。然后新建了一个结点,item = 2 ,然后l赋值给第二个结点的prev ,即二结的prev指向一结,然后last = newNode 就是last不在指向一结而指向二结,在往下if语句判定l不为空,则执行else{l.next = newNode},即一结的next指向二结。
6.size++ modCount++
二、
// linkedList.remove有三种,第一种remove(int,index)指定删除哪一个位置,第二种remove()删除第一个,remove(Objece o)先对链表中的对象进行比较,然后删除指定的对象
1.执行removeFirst()
2.首先让f指向first,即指向第一个结点,然后if语句判断f不为空,为空抛出异常(防止删除空链表)。执行unlinkFirst()方法。
3.此时有三个结点,上面我add了个3,此时f指向头结点,last指向尾结点,首先将f.item赋值给element。
4.next指向f.next,即next指向二结,然后f.item即一结item为空,然后令f.next为空,所以一结的next不在指向二结,然后first=next,即first指向二结。然后if语句判定next不为空,执行else{next.prev=null},即二结的prev为空,所以二结的prev不在指向一结,此时一结点就是个孤儿,三个属性都为空。
5.size-- ; modCount++
6.返回element,把原来的值返回去,让人知道删除的内容是什么。
欢迎分享,转载请注明来源:内存溢出
LinkedList的增删改查,以及源码分析
赞
(0)
打赏
微信扫一扫
支付宝扫一扫
贪心算法--经典问题(java实现)
上一篇
2022-12-17
JAVA日期格式化大写YYYY-MM-dd和小写yyyy-MM-DD的坑
下一篇
2022-12-17
评论列表(0条)