1. 结构定义:
public class LinkedList<E> {
private int size;
private Node<E> first;
static final int ELEMENT_NOT_FOUND = -1;
private static class Node<E> {
E element;
Node<E> next;
public Node(E element, Node<E> next) {
this.element = element;
this.next = next;
}
public void clear();
public int size();
public boolean isEmpty();
public boolean contains(E element);
public int indexOf(E element);
private Node<E> node(int index);
public void add(E element);
public E get(int index);
public E set(int index, E element);
public void add(int index, E element);
public E remove(int index);
}
2. 清空元素
public void clear(){
size = 0;
first = null;
}
3. 获取元素个数
public int size(){
return size;
}
4.是否为空
public boolean isEmpty(){
return size == 0;
}
5.查看元素的索引
public int indexOf(E element){
if(element == null){
Node<E> node = first;
for(int i = 0; i < size; i++){
if(node.element == null) return i;
node = node.next;
}
} else{
Node<E> node = first;
for(int i = 0; i < size; i++){
if(element.equals(node.element)) return i;
node = node.next;
}
}
return ELEMENT_NOT_FOUND;
}
6.是否包含某个元素
public boolean contains(E element){
return indexOf(element) != ELEMENT_NOT_FOUND;
}
7.获取index位置对应的节点对象
private Node<E> node(int index){
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size);
}
Node<E> node = first;
for(int i = 0; i < index; i++ ){
node = node.next;
}
return node;
}
8.获取index位置的元素
public E get(int index){
return node(index).element;
}
9.设置index位置的元素
public E set(int index, E element){
Node<E> node = node(index);
E old = node.element;
node.element = element;
return old;
}
10.在index位置插入一个元素
public void add(int index, E element){
if (index < 0 || index > size) {
throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size);
}
if(index == 0){
first = new Node<E>(element, first);
}else{
Node<E> prev = node(index-1);
prev.next = new Node<E>(element, prev.next);
}
size++;
}
11.添加元素到尾部
public void add(E element){
add(size,element);
}
12.删除index位置的元素
public E remove(int index){
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size);
}
Node<E> node = first;
if(index == 0){
first = first.next;
} else{
Node<E> prev = node(index-1);
node = prev.next;
prev.next = node.next;
}
size--;
return node.element;
}