zoukankan      html  css  js  c++  java
  • 4.2在链表中添加元素

    对于链表来说,我们要想访问存在在链表中的所有的节点,必须把链表的头给存储起来,头:head,也就是说在LinkedList这个类中,应该有个node型的变量,叫head,它指链表中的第一个节点。

    1 //声明LinkedList中基本的成员变量head,size
    2 private Node head; 
    3 private int size;//记录链表中有多少个元素

     1   // 在链表头添加新的元素e
     2     public void addFirst(E e){
     3 //        Node node = new Node(e);
     4 //        node.next = head;       //node.next指向head,原本的头元素head变成e后面一位.
     5 //        head = node;          //head指向node,新添加的元素e变成头元素
     6 
     7         head = new Node(e, head);//上面三行的另一种写法,首先new一个Node,对于new出来的Node,存入的就是e,而这个Node让他直接指向当前这个链表的head,然后赋值个head
     8                                    //注:前面创建了构造函数 public Node(E e, Node next)
     9         size ++;
    10     }

     1后面插666,,66后面接2。

    要把666插入到正确的位置,必须要找到当我们插入666这个节点之后,节点666前的节点是谁,记这个谁为prev

     

     1 // 在链表的index(0-based)位置添加新的元素e
     2     // 在链表中不是一个常用的操作,练习用:)
     3     public void add(int index, E e){
     4 
     5         if(index < 0 || index > size)     //判断index的合法性,index可以取到size,即可在链表的末尾添加一个元素
     6             throw new IllegalArgumentException("Add failed. Illegal index.");
     7 
     8         if(index == 0)//如果在链表头添加元素
     9             addFirst(e);
    10         else{
    11             Node prev = head;
    12             for(int i = 0 ; i < index - 1 ; i ++)
    13                 prev = prev.next;  //把当前prev存的节点的下一个节点放进prev这个变量中。prev这个变量就会在链表中一直移动,直到移动到 index - 1这个位置,
    14                                     //我们就找到了等待插入的节点的前一个节点
    15 //            Node node = new Node(e);
    16 //            node.next = prev.next;
    17 //            prev.next = node;
    18 
    19             prev.next = new Node(e, prev.next);//上面3行的另一种写法
    20             size ++;
    21         }
    22     }

    完整代码

     1 public class LinkedList<E> {
     2     //******************创建LinkedLis的内部类Node***********************//
     3     private class Node{
     4         public E e;
     5         public Node next;
     6 
     7         public Node(E e, Node next){
     8             this.e = e;
     9             this.next = next;
    10         }
    11 
    12         public Node(E e){
    13             this(e, null);
    14         }
    15 
    16         public Node(){
    17             this(null, null);
    18         }
    19 
    20         @Override
    21         public String toString(){
    22             return e.toString();
    23         }
    24     }
    25    //***************************创建内部类Node**********结束********//
    26 
    27     //%%%%%%%%%%%%%%%%%%%%%%%%%%创建类LinkedList的成员变量和构造方法%%%%%%%%%%%%%%%%%%%//
    28     private Node head;  //声明LinkedList中基本的成员变量head,size
    29     private int size;//记录链表中有多少个元素
    30 
    31     public LinkedList(){   //设置链表构造函数
    32         head = null;       //用户初始化链表head为空,也就是说,初始化是链表中一个元素都没有
    33         size = 0;
    34     }
    35     //%%%%%%%%%%%%%%%%%%%%%%%%%%创建类LinkedList的成员变量和构造方法%%%%%%结束%%%%%%%%%%%%%//
    36 
    37             //-------------设置LinkedList的方法getSize、isEmpty、addFirst、add、addLast-------------------//
    38     // 获取链表中的元素个数
    39     public int getSize(){
    40         return size;
    41     }
    42 
    43     // 返回链表是否为空
    44     public boolean isEmpty(){
    45         return size == 0;
    46     }//如果size的值为0,返回TRUE;否则返回FALSE
    47 
    48     // 在链表头添加新的元素e
    49     public void addFirst(E e){
    50 //        Node node = new Node(e);
    51 //        node.next = head;       //node.next指向head,原本的头元素head变成e后面一位.
    52 //        head = node;          //head指向node,新添加的元素e变成头元素
    53 
    54         head = new Node(e, head);//上面三行的另一种写法,首先new一个Node,对于new出来的Node,存入的就是e,而这个Node让他直接指向当前这个链表的head,然后赋值个head
    55                                    //注:前面创建了构造函数 public Node(E e, Node next)
    56         size ++;
    57     }
    58 
    59     // 在链表的index(0-based)位置添加新的元素e
    60     // 在链表中不是一个常用的操作,练习用:)
    61     public void add(int index, E e){
    62 
    63         if(index < 0 || index > size)     //判断index的合法性,index可以取到size,即可在链表的末尾添加一个元素
    64             throw new IllegalArgumentException("Add failed. Illegal index.");
    65 
    66         if(index == 0)//如果在链表头添加元素
    67             addFirst(e);
    68         else{
    69             Node prev = head;
    70             for(int i = 0 ; i < index - 1 ; i ++)
    71                 prev = prev.next;  //把当前prev存的节点的下一个节点放进prev这个变量中。prev这个变量就会在链表中一直移动,直到移动到 index - 1这个位置,
    72                                     //我们就找到了等待插入的节点的前一个节点
    73 //            Node node = new Node(e);
    74 //            node.next = prev.next;
    75 //            prev.next = node;
    76 
    77             prev.next = new Node(e, prev.next);//上面3行的另一种写法
    78             size ++;
    79         }
    80     }
    81 
    82     // 在链表末尾添加新的元素e
    83     public void addLast(E e){
    84         add(size, e);
    85     }
    86     //-------------设置方法getSize、isEmpty、addFirst、add、addLast--结束-----------------//
    87 }
    带女朋友搬家新家条件不好,累到女朋友了,让女朋友受苦了,特此明志:每天学习,明年这个时候(20190812)让女朋友住上大房子,永远年轻,永远热泪盈眶,很多人都是这样,他们都把自己当成身在梦中一样,浑浑噩噩地过日子,只有痛苦或爱或危险可以让他们重新感到这个世界的真实。
  • 相关阅读:
    erlang转化中文为url
    erlang中检查内存泄露
    git找回当前目录下误删的所有文件
    使用rebar编译lager,deps列表,lager要放到第一位。
    Visualizing Concurrency in Go--转
    erlang init:stop()不起效
    linux设置时间
    erlang驱动使用mysql-otp
    mysql-otp 驱动中设置utf8mb4
    erlang node time ticket
  • 原文地址:https://www.cnblogs.com/make-big-money/p/10320587.html
Copyright © 2011-2022 走看看