对于链表来说,我们要想访问存在在链表中的所有的节点,必须把链表的头给存储起来,头: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 }