一、接口
package linkedList;
public interface AbstrctLinkedList<E> {
int size();//元素数量
boolean isEmpty();//是否为空
boolean contains(E element);//是否包含某个元素
void add(E element);//添加元素到最后面
E get(int index);//返回index位置对应的元素
E set(int index,E element);//设置index位置的元素
void add(int index,E element);//往index位置添加元素
E remove(int index);//删除index位置对应的元素
int indexOf(E element);//查看元素的位置
void clear();//清除所有元素
}
二、实现
package linkedList;
public class LinkedList<E> implements AbstrctLinkedList<E>{
private static final int ELEMENT_NOT_FOUND = -1;
private int size;
private Node<E> first;
private static class Node<E> {
E element;
Node<E> next;
public Node(E element, Node<E> next) {
this.element = element;
this.next = next;
}
}
@Override
public int size() {
return size;
}
@Override
public boolean isEmpty() {
return size == 0;
}
@Override
public boolean contains(E element) {
return indexOf(element) != ELEMENT_NOT_FOUND;
}
@Override
public void add(E element) {
add(size,element);
}
@Override
public E get(int index) {
return node(index).element;
}
@Override
public E set(int index, E element) {
Node<E> node = node(index);
E old = node.element;
node.element = element;
return old;
}
@Override
public void add(int index, E element) {
rangeCheckForAdd(index);
if(index == 0){
first = new Node<>(element, first);
}else{
Node<E> prev = node(index - 1);
prev.next = new Node<>(element,prev.next);
}
size ++;
}
@Override
public E remove(int index) {
rangeCheck(index);
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;
}
@Override
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;
}
@Override
public void clear() {
size = 0;
first = null;
}
private void rangeCheckForAdd(int index){
if(index < 0 || index > size) throw new IndexOutOfBoundsException("Index:"+ index +",Size"+size);
}
private void rangeCheck(int index){
if(index < 0 || index >= size) throw new IndexOutOfBoundsException("Index:"+ index +",Size" + size);
}
private void outOfBounds(int index){
throw new IndexOutOfBoundsException("Index:"+ index + ", Size" + size);
}
private Node<E> node(int index){
rangeCheck(index);
Node<E> node = first;
for (int i = 0; i < index; i++) {
node = node.next;
}
return node;
}
@Override
public String toString(){
StringBuilder string = new StringBuilder();
string.append("size=").append(size).append(", [");
Node<E> node = first;
for (int i = 0; i < size; i++) {
if(i != 0){
string.append(", ");
}
string.append(node.element);
node = node.next;
}
string.append("]");
return string.toString();
}
}
三、测试
public class LinkedListTest {
@Test
public void test(){
LinkedList<Integer> list = new LinkedList<>();
list.add(20);
list.add(0,10);
list.add(30);
list.add(list.size(),40);
list.remove(1);
System.out.println(list);
}
}
结果:
size=3, [10, 30, 40]
四、总结
无