在链表头插入节点 - void addFirst(E e)
- head首先是个Node的引用型变void addFirst(E e)量,它可以指向一块内存空间,也可以指向null,引用型变量只具备指的能力;
- LinkedList这种数据结构,只包含了一个头指针head,head是个引用型变量,只具备指的能力;在LinkedList初始化的时候,其只包含了一个头指针head,这个head指向null;
- new Node(e)创建的是一个next指向null的节点;
- 向链表中添加一个元素的时候要本着“先入队再整队”的原则;
- node.next = head即为“先入队”,让新元素链入队列;head指向null,那么node.next就指向null;head指向队首节点,那么node.next就指向队首节点,从而排在最前面成为队首节点;
- head = node即为“后整队”,让head重新“追”到队首;head和node都是Node类型的引用型变量,所以head可以指向node所指向的内存空间;
// 在链表头添加新的元素e
public void addFirst(E e){
// Node node = new Node(e);
// node.next = head;
// head = node;
head = new Node(e, head);
size ++;
}
在链表的任一位置插入节点 - void add(int index, E e)
- 在链表中是没有索引这个概念的,这里引入索引的概念,便于理解,作练习用;
- 如果size是3,那么0,1,2,3这4个位置都是合法的插入位置;
- 在寻找插入位置的前驱节点时,注意循环的终止条件 i < index -1 ,i 会停在要插入位置的前2个的位置上,此时 prev = prev.next 会使prev停在插入位置的前1个位置,即找到了插入节点的前驱节点;
- 在链表中间插入元素时,插入位置的前一个元素要确保“新人抓牢再松手”;
- 插入完成后维护链表的节点个数size;
// 在链表的index(0-based)位置添加新的元素e
// 在链表中不是一个常用的操作,练习用:)
public void add(int index, E e){
if(index < 0 || index > size)
throw new IllegalArgumentException("Add failed. Illegal index.");
if(index == 0)
addFirst(e);
else{
Node prev = head;
for(int i = 0 ; i < index - 1 ; i ++)
prev = prev.next;
// Node node = new Node(e);
// node.next = prev.next;
// prev.next = node;
prev.next = new Node(e, prev.next);
size ++;
}
}
// 在链表末尾添加新的元素e
public void addLast(E e){
add(size, e);
}