LinkedList的增删改查,以及源码分析

LinkedList的增删改查,以及源码分析,第1张

LinkedList的增删改查,以及源码分析
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,把原来的值返回去,让人知道删除的内容是什么。

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5684922.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存