zoukankan      html  css  js  c++  java
  • 内功心法 -- java.util.LinkedList<E> (4)

    写在前面的话:读书破万卷,编码如有神
    --------------------------------------------------------------------
    下文主要对java.util.LinkedList<E>的4个位置访问操作进行介绍,主要内容包括:

    1、LinkedList常用的4个位置访问操作介绍

    参考内容:

    1、JDK源码(1.7)

    --------------------------------------------------------------------

    1、LinkedList常用的4个位置访问操作介绍                                 

    (1)E get(int index)

    功能: 返回此双端队列中index位置上的节点

    示例代码:

     1 import java.util.LinkedList;
     2 
     3 public class LinkedListDemo {
     4     public static void main(String[] args) {
     5         /*********测试LinkedList的'E get(int index)'方法的使用**********/
     6         
     7         //创建一个LinkedList对象
     8         LinkedList<Student> linkedList = new LinkedList<Student>();
     9         
    10         //创建一个Student对象,并将其添加到LinkedList对象中
    11         Student stu1 = new Student(1,"zhangsan",20);
    12         linkedList.add(stu1);
    13         
    14         //创建一个Student对象,并将其添加到LinkedList对象中
    15         Student stu2 = new Student(2,"lisi",21);
    16         linkedList.add(stu2);
    17         
    18         //创建一个Student对象,并将其添加到LinkedList对象中
    19         Student stu3 = new Student(3,"wangwu",22);
    20         linkedList.add(stu3);
    21         System.out.println("linkedList:" + linkedList);
    22         
    23         System.out.println("linkedList.get(2):" + linkedList.get(2));
    24         System.out.println("linkedList:" + linkedList);
    25         
    26         //此方法将抛出异常
    27         System.out.println("linkedList.get(5):" + linkedList.get(5));
    28     }
    29 }
    30 
    31 运行结果:
    32 linkedList:[Student [stuId=1, stuName=zhangsan, stuAge=20], Student [stuId=2, stuName=lisi, stuAge=21], Student [stuId=3, stuName=wangwu, stuAge=22]]
    33 linkedList.get(2):Student [stuId=3, stuName=wangwu, stuAge=22]
    34 linkedList:[Student [stuId=1, stuName=zhangsan, stuAge=20], Student [stuId=2, stuName=lisi, stuAge=21], Student [stuId=3, stuName=wangwu, stuAge=22]]
    35 Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 5, Size: 3
    36     at java.util.LinkedList.checkElementIndex(LinkedList.java:553)
    37     at java.util.LinkedList.get(LinkedList.java:474)
    38     at LinkedListDemo.main(LinkedListDemo.java:27)

    源代码如下:

     1     /*
     2        返回此双端队列中index位置上的节点
     3     */
     4     public E get(int index) {
     5         //检查index参数是否合法,调用内部方法checkElementIndex
     6         checkElementIndex(index);
     7 
     8         //返回双端队列中index位置上的节点
     9         return node(index).item;
    10     }
    11 
    12     /*
    13         检查index参数是否合法
    14     */
    15     private void checkElementIndex(int index) {
    16         //如果不合法,则抛出异常
    17         if (!isElementIndex(index))
    18             throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
    19     }
    20 
    21     /*
    22         检查参数index是合法
    23     */
    24     private boolean isElementIndex(int index) {
    25         return index >= 0 && index < size;
    26     }
    27 
    28     /*
    29          返回双端队列index位置上的节点
    30     */
    31     Node<E> node(int index) {
    32         // assert isElementIndex(index);
    33 
    34         if (index < (size >> 1)) {
    35             //如果要求返回的节点位置index,在双端队列的前一半,则从头往尾找
    36             Node<E> x = first;
    37             for (int i = 0; i < index; i++)
    38                 x = x.next;
    39             return x;
    40         } else {
    41             //如果要求返回的节点位置index,在双端队列的后一半,则从尾往头找
    42             Node<E> x = last;
    43             for (int i = size - 1; i > index; i--)
    44                 x = x.prev;
    45             return x;
    46         }
    47     }

    (2)E set(int index, E element)

    功能: 将此双端队列中index位置上的节点替换为element节点,并返回被替换的节点

    示例代码:

     1 import java.util.LinkedList;
     2 
     3 public class LinkedListDemo {
     4     public static void main(String[] args) {
     5         /*********测试LinkedList的'E set(int index, E element)'方法的使用**********/
     6         
     7         //创建一个LinkedList对象
     8         LinkedList<Student> linkedList = new LinkedList<Student>();
     9         
    10         //创建一个Student对象,并将其添加到LinkedList对象中
    11         Student stu1 = new Student(1,"zhangsan",20);
    12         linkedList.add(stu1);
    13         
    14         //创建一个Student对象,并将其添加到LinkedList对象中
    15         Student stu2 = new Student(2,"lisi",21);
    16         linkedList.add(stu2);
    17         
    18         //创建一个Student对象,并将其添加到LinkedList对象中
    19         Student stu3 = new Student(3,"wangwu",22);
    20         linkedList.add(stu3);
    21         System.out.println("linkedList:" + linkedList);
    22         
    23         Student stu4 = new Student(4,"xiaohong",22);
    24         System.out.println("linkedList.set(1,stu4):" + linkedList.set(1,stu4));
    25         System.out.println("linkedList:" + linkedList);
    26         
    27         //此方法将抛出异常
    28         System.out.println("linkedList.set(7,stu4):" + linkedList.set(7,stu4));
    29     }
    30 }
    31 
    32 运行结果:
    33 linkedList:[Student [stuId=1, stuName=zhangsan, stuAge=20], Student [stuId=2, stuName=lisi, stuAge=21], Student [stuId=3, stuName=wangwu, stuAge=22]]
    34 linkedList.set(1,stu4):Student [stuId=2, stuName=lisi, stuAge=21]
    35 linkedList:[Student [stuId=1, stuName=zhangsan, stuAge=20], Student [stuId=4, stuName=xiaohong, stuAge=22], Student [stuId=3, stuName=wangwu, stuAge=22]]
    36 Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 7, Size: 3
    37     at java.util.LinkedList.checkElementIndex(LinkedList.java:553)
    38     at java.util.LinkedList.set(LinkedList.java:488)
    39     at LinkedListDemo.main(LinkedListDemo.java:28)

    源代码如下:

     1    /*
     2         将此双端队列中index位置上的节点替换为element节点,并返回被替换的节点
     3    */ 
     4    public E set(int index, E element) {
     5         //检查index参数是否合法
     6         checkElementIndex(index);
     7         //查找双端队列中index位置上的节点
     8         Node<E> x = node(index);
     9         //记录要被替换的节点
    10         E oldVal = x.item;
    11         //设置双端队列中index位置上的节点的值为element
    12         x.item = element;
    13         //返回被替换的老节点
    14         return oldVal;
    15     }

    (3)void add(int index, E element)

    功能: 将元素element添加到双端队列的index位置上

    示例代码:

     1 import java.util.LinkedList;
     2 
     3 public class LinkedListDemo {
     4     public static void main(String[] args) {
     5         /*********测试LinkedList的'void add(int index, E element)'方法的使用**********/
     6         
     7         //创建一个LinkedList对象
     8         LinkedList<Student> linkedList = new LinkedList<Student>();
     9         
    10         //创建一个Student对象,并将其添加到LinkedList对象中
    11         Student stu1 = new Student(1,"zhangsan",20);
    12         linkedList.add(stu1);
    13         
    14         //创建一个Student对象,并将其添加到LinkedList对象中
    15         Student stu2 = new Student(2,"lisi",21);
    16         linkedList.add(stu2);
    17         
    18         //创建一个Student对象,并将其添加到LinkedList对象中
    19         Student stu3 = new Student(3,"wangwu",22);
    20         linkedList.add(stu3);
    21         System.out.println("linkedList:" + linkedList);
    22         
    23         Student stu4 = new Student(4,"xiaohong",22);
    24         linkedList.add(1,stu4);
    25         System.out.println("linkedList:" + linkedList);
    26         
    27         //此方法将抛出异常
    28         linkedList.add(7,stu4);
    29     }
    30 }
    31 
    32 运行结果:
    33 linkedList:[Student [stuId=1, stuName=zhangsan, stuAge=20], Student [stuId=2, stuName=lisi, stuAge=21], Student [stuId=3, stuName=wangwu, stuAge=22]]
    34 linkedList:[Student [stuId=1, stuName=zhangsan, stuAge=20], Student [stuId=4, stuName=xiaohong, stuAge=22], Student [stuId=2, stuName=lisi, stuAge=21], Student [stuId=3, stuName=wangwu, stuAge=22]]
    35 Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 7, Size: 4
    36     at java.util.LinkedList.checkPositionIndex(LinkedList.java:558)
    37     at java.util.LinkedList.add(LinkedList.java:505)
    38     at LinkedListDemo.main(LinkedListDemo.java:28)

    源代码如下:

     1     /*
     2       功能: 将元素element添加到双端队列的index位置
     3     */
     4     public void add(int index, E element) {
     5 
     6         //检查参数index是否合法
     7         checkPositionIndex(index);
     8 
     9         
    10         if (index == size){
    11             //添加到双端队列的尾部
    12             linkLast(element);
    13         }
    14         else{
    15             //添加在双端队列的中间
    16             linkBefore(element, node(index));
    17         }
    18     }    

    (4)E remove(int index)

    功能: 将此双端队列的index位置上的元素删除

    示例代码:

     1 import java.util.LinkedList;
     2 
     3 public class LinkedListDemo {
     4     public static void main(String[] args) {
     5         /*********测试LinkedList的'E remove(int index)'方法的使用**********/
     6         
     7         //创建一个LinkedList对象
     8         LinkedList<Student> linkedList = new LinkedList<Student>();
     9         
    10         //创建一个Student对象,并将其添加到LinkedList对象中
    11         Student stu1 = new Student(1,"zhangsan",20);
    12         linkedList.add(stu1);
    13         
    14         //创建一个Student对象,并将其添加到LinkedList对象中
    15         Student stu2 = new Student(2,"lisi",21);
    16         linkedList.add(stu2);
    17         
    18         //创建一个Student对象,并将其添加到LinkedList对象中
    19         Student stu3 = new Student(3,"wangwu",22);
    20         linkedList.add(stu3);
    21         System.out.println("linkedList:" + linkedList);
    22         
    23         System.out.println("linkedList.remove(2):" + linkedList.remove(2));
    24         System.out.println("linkedList:" + linkedList);
    25         
    26         //此方法将会抛出异常
    27         linkedList.remove(8);
    28     }
    29 }
    30 
    31 运行结果:
    32 linkedList:[Student [stuId=1, stuName=zhangsan, stuAge=20], Student [stuId=2, stuName=lisi, stuAge=21], Student [stuId=3, stuName=wangwu, stuAge=22]]Exception in thread "main" 
    33 linkedList.remove(2):Student [stuId=3, stuName=wangwu, stuAge=22]
    34 linkedList:[Student [stuId=1, stuName=zhangsan, stuAge=20], Student [stuId=2, stuName=lisi, stuAge=21]]
    35 java.lang.IndexOutOfBoundsException: Index: 8, Size: 2
    36     at java.util.LinkedList.checkElementIndex(LinkedList.java:553)
    37     at java.util.LinkedList.remove(LinkedList.java:523)
    38     at LinkedListDemo.main(LinkedListDemo.java:27)

    源代码如下:

     1     /*
     2       将此双端队列的index位置上的元素删除
     3    */
     4     public E remove(int index) {
     5         //检查参数index是否合法
     6         checkElementIndex(index);
     7         //删除节点
     8         return unlink(node(index));
     9     }
    10 
    11     //检查参数index是合法
    12     private void checkElementIndex(int index) {
    13         //调用内部方法isElementIndex检查参数index是合法,不合法则抛出异常
    14         if (!isElementIndex(index))
    15             throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
    16     }
    17 
    18     //检查参数index是否合法
    19     private boolean isElementIndex(int index) {
    20         return index >= 0 && index < size;
    21     }
    22 
    23     //返回此双端队列index位置上的节点元素
    24     Node<E> node(int index) {
    25         // assert isElementIndex(index);
    26 
    27         
    28         if (index < (size >> 1)) {
    29             //如果要求返回的节点位置index,在双端队列的前一半,则从头往尾找
    30             Node<E> x = first;
    31             for (int i = 0; i < index; i++)
    32                 x = x.next;
    33             return x;
    34         } else {
    35             //如果要求返回的节点位置index,在双端队列的后一半,则从尾往头找
    36             Node<E> x = last;
    37             for (int i = size - 1; i > index; i--)
    38                 x = x.prev;
    39             return x;
    40         }
    41     }
    42     
    43      /*
    44         删除双端队列中 节点x
    45     */
    46     E unlink(Node<E> x) {
    47         // assert x != null;
    48         //记录x节点的值
    49         final E element = x.item;
    50         //记录x节点的下一个节点
    51         final Node<E> next = x.next;
    52         //记录x节点的上一个节点
    53         final Node<E> prev = x.prev;
    54         
    55         if (prev == null) {
    56             //如果x节点没有上一个节点,则赋值双端队列对象的first属性为next
    57             first = next;
    58         } else {
    59             //如果x节点有上一个节点,则赋值x节点的上一个节点的next属性为next
    60             prev.next = next;
    61             x.prev = null;
    62         }
    63 
    64         if (next == null) {
    65             //如果x节点没有下一个节点,则赋值双端队列对象的last属性为prev
    66             last = prev;
    67         } else {
    68             //如果x节点有下一个节点,则赋值x节点的下一个节点的prev属性为prev
    69             next.prev = prev;
    70             x.next = null;
    71         }
    72         
    73         //设置被删除节点的值为null,方便GC
    74         x.item = null;
    75         //双端队列中元素个数减1
    76         size--;
    77         //fast-fail机制标识加1
    78         modCount++;
    79         return element;
    80     }

    --------------------------------------------------------------------

    java.util.LinkedList<E>系列文章                                            

    java.util.LinkedList<E>(1)  java.util.LinkedList<E>(2)  java.util.LinkedList<E>(3)

    java.util.LinkedList<E>(4)  java.util.LinkedList<E>(5)  java.util.LinkedList<E>(6)

    java.util.LinkedList<E>(7)  java.util.LinkedList<E>(8)  

    --------------------------------------------------------------------

    相关知识                                                                             

    java.util.Collection<E>   java.util.AbstractCollection<E>   java.util.List<E>

    java.util.AbstractList<E>   java.util.Iterator<E>   java.util.ListIterator<E>

    Java中的标记接口   迭代器模式   Java中的深拷贝和浅拷贝  java.util.Arrays

    java.util.Queue<E>  java.util.Deque<E>

     

  • 相关阅读:
    【NOIP2018】游记
    题解 P1441 【砝码称重】
    题解 P3128 【[USACO15DEC]最大流Max Flow】
    题解 P1949 【聪明的打字员_NOI导刊2011提高(10)】
    题解 P1966 【火柴排队】
    题解 P1895 【数字序列】
    topcoder做题
    1149E
    hdu 6589
    hdu 6579
  • 原文地址:https://www.cnblogs.com/xinhuaxuan/p/6386368.html
Copyright © 2011-2022 走看看