LinkedList添加、删除方法分析(JDK8)

1、add(E e) 添加方法,会直接在LinkedList 的尾部插入元素,方法内部调用的linkLast(e);
void linkLast(E e) {
final Node l = last;
final Node newNode = new Node<>(l, e, null);
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}
首先将成员变量last赋值给临时变量l,然后使用有参构造创建新的节点newNode,并指定新节点的直接前驱为l,元素为e,直接后继为null
将新创建的newNode赋给last变量,然后判断l是否为null,为空则表示当前链表没有元素,那么添加后链表的第一个元素也是newNode,first = newNode;
否则将l的后继指向nowNode,l.next = newNode; 。

2、add(int index, E element) 在指定位置插入节点

            public void add(int index, E element) {
            checkPositionIndex(index);

            if (index == size)
                linkLast(element);
            else
                linkBefore(element, node(index));
            }

        经过下标越界检查后,首先判断要插入的位置是否为链表的末尾,if (index == size),如果是,就调用linkLast方法完成添加数据;
        否则,调用linkBefore方法添加

            void linkBefore(E e, Node<E> succ) {
                // assert succ != null;
               final Node<E> pred = succ.prev;
               final Node<E> newNode = new Node<>(pred, e, succ);
               succ.prev = newNode;
               if (pred == null)
                   first = newNode;
               else
                   pred.next = newNode;
                   size++;
                   modCount++;
             }
        succ变量是通过node方法在集合中查找的,该方法是返回指定下标的非空节点,进入linkBefore方法内
        首先将succ的直接前驱的引用指向临时变量pred,然后通过有参构造创建新的节点newNode,并指定新节点的直接前驱为pred,直接后继为指定位置所在的succ
        修改succ的前驱为newNode,succ.prev = newNode;     
        判断pred是否为空,if (pred == null),是 则表示指定的位置节点succ是首节点,将首节点first修改为newNode,first = newNode; 
        不为空,则将当前位置节点succ的前驱pred的直接后继指向新节点newNode,pred.next = newNode; 。

3、removeFirst()、removeLast() 方法
两个方法,都会先判断fist或last变量是否为null,如果是,会抛出throw new NoSuchElementException();

         removeFirst方法是内部调用unlinkFirst(Node<E> f)方法,首先获取到first节点的元素final E element = f.item 以及 下一个节点 final Node<E> next = f.next;
         将这两个变量设置为null,f.item = null; f.next = null; ,然后将刚刚已经获取到的当前节点的下一个节点next赋值给first变量,first = next;
         然后判断next变量是否为空 if (next == null) last = null; ,为空则表示当前链表只有一个元素,将last也设置为null,否,则将next的直接前驱设置为null,next.prev = null;。

         removeLast方法,内部调用的是unlinkLast(Node<E> l),先获取节点元素和直接前驱 final E element = l.item;final Node<E> prev = l.prev;
         设置这两个变量为null,l.item = null;l.prev = null; // help GC
         将变量last修改为prev,即最后一个节点的上一个node,last = prev;
         然后判断prev是否为空,是,则表示当前链表只有一个元素,将first也设置为null,否,则prev的直接后继next设置为null。

4、remove(E e)删除指定元素、remove(int index)删除指定索引处的元素

         都是通过调用unlink(Node<E> x)方法完成的:
                 E unlink(Node<E> x) {
                     // assert x != null;
                    final E element = x.item;
                    final Node<E> next = x.next;
                    final Node<E> prev = x.prev;

                    if (prev == null) {
                        first = next;
                    } else {
                        prev.next = next;
                        x.prev = null;
                    }

                    if (next == null) {
                       last = prev;
                    } else {
                       next.prev = prev;
                       x.next = null;
                    }

                       x.item = null;
                       size--;
                       modCount++;
                       return element;
                  }

方法首先获取当前节点的元素以及直接后继节点next和直接前驱节点prev,
首先判断prev是否为空,是,则表示当前节点是头节点,那么将首节点first设置为下一个节点next,first = next;,否,则将x节点的上一个节点的直接后继设置为x的下一个节点next,prev.next = next;,并断开x与prev的链接,x.prev = null;。
然后判断next是否为空,是表示当前节点是尾节点,将尾节点设置为当前x节点的前一个节点prev, last = prev;,否,则将x节点的下一个节点next的直接前驱设置为x的直接前驱prev,next.prev = prev;,并断开x和next的链接,x.next = null;。
到此,x已经断开了与直接前驱和直接后继的链接,往下再将x的元素设置为null,x.item = null;,即完成节点删除。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在JDK 1.8,API文档是用英文编写的,但是我可以为你提供一些英文和文对照的示例。 1. Object类 (Object class) - equals()方法: 判断两个对象是否相等。 - toString()方法: 返回对象的字符串表示。 - hashCode()方法: 返回对象的哈希码值。 2. String类 (String class) - length()方法: 返回字符串的长度。 - charAt()方法: 返回指定位置的字符。 - substring()方法: 返回子串。 3. ArrayList类 (ArrayList class) - add()方法: 将元素添加到ArrayList。 - get()方法: 获取指定位置的元素。 - remove()方法: 删除指定位置的元素。 4. HashMap类 (HashMap class) - put()方法: 将键值对添加到HashMap。 - get()方法: 根据键获取对应的值。 - remove()方法: 根据键删除键值对。 5. DateTimeFormatter类 - parse()方法: 将字符串解析为日期时间对象。 - format()方法: 将日期时间对象格式化为字符串。 请注意,这只是一小部分JDK 1.8 API方法示例,整个API文档提供了更多详细的说明和示例。您可以参考官方的JDK 1.8 API文档以获取更全面的信息。 ### 回答2: 1. java.lang 包下的常用类: - Object:对象类 - Class:类类 - String:字符串类 - StringBuilder:字符串构建器类 - StringBuffer:字符串缓冲类 - System:系统类,提供与系统相关的方法和属性 - Math:数学类,提供数学相关的方法和常量 - Boolean:布尔类 - Byte:字节类 - Character:字符类 - Short:短整数类 - Integer:整数类 - Long:长整数类 - Float:单精度浮点数类 - Double:双精度浮点数类 - Enum:枚举类 - Throwable:可抛出对象类,是所有错误和异常的基类 2. java.util 包下的常用类: - ArrayList:动态数组类 - LinkedList:链表类 - HashMap:哈希映射类 - LinkedHashMap:有序哈希映射类 - TreeSet:树集类 - TreeMap:树映射类 - HashSet:哈希集合类 - LinkedHashSet:有序哈希集合类 - Queue:队列接口 - PriorityQueue:优先队列类 - Stack:栈类 - Iterator:迭代器接口 - ListIterator:列表迭代器接口 - Comparator:比较器接口 - Calendar:日历类 - Date:日期类 - Timer:定时器类 3. java.io 包下的常用类: - File:文件类 - InputStream:输入流接口 - OutputStream:输出流接口 - Reader:字符输入流接口 - Writer:字符输出流接口 - BufferedReader:缓冲字符输入流类 - BufferedWriter:缓冲字符输出流类 - FileReader:文件字符输入流类 - FileWriter:文件字符输出流类 - FileInputStream:文件字节输入流类 - FileOutputStream:文件字节输出流类 - ObjectInputStream:对象输入流类 - ObjectOutputStream:对象输出流类 - PrintWriter:打印输出流类 - RandomAccessFile:随机访问文件类 - ByteArrayInputStream:字节数组输入流类 - ByteArrayOutputStream:字节数组输出流类 - CharArrayReader:字符数组输入流类 - CharArrayWriter:字符数组输出流类 这些只是jdk1.8 API的一部分常用类和接口,还有很多其他类和接口不一一列举。 ### 回答3: JDK 1.8的API是指Java开发工具包1.8版本提供的所有类、接口和方法,它们用于开发Java应用程序。下面是一些常用API的英文对照: 1. java.lang包: - Object: 对象 - String: 字符串 - Integer: 整型 - Double: 双精度浮点型 - Math: 数学计算 2. java.util包: - ArrayList: 数组列表 - LinkedList: 链表 - HashMap: 哈希表 - TreeSet: 树集合 - PriorityQueue: 优先队列 3. java.io包: - File: 文件 - InputStream: 输入流 - OutputStream: 输出流 - BufferedReader: 缓冲读取器 - BufferedWriter: 缓冲写入器 4. java.awt包: - Frame: 框架 - Button: 按钮 - Label: 标签 - TextField: 文本框 - Checkbox: 复选框 5. java.net包: - Socket: 套接字 - ServerSocket: 服务器套接字 - URL: 统一资源定位符 - HttpURLConnection: HTTP连接 这只是JDK 1.8 API一小部分常用类和接口的英文对照,实际上API包含了更多的类和接口,用于满足不同的编程需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值