package list;
/**
* Created by william on 2017/2/25.
*/
public class LinkedList<T> implements List<T> {
private int size;
private Node<T> first;
private Node<T> last;
private static class Node<T> {
Node next;
Node prev;
T data;
Node(Node<T> prev, Node next, T data) {
this.prev = prev;
this.next = next;
this.data = data;
}
}
@Override
public int size() {
return this.size;
}
@Override
public boolean isEmpty() {
return size == 0;
}
@Override
public boolean contains(T ele) {
Node head = first;
while (head != null) {
if ((ele == null && head.data == null) || (ele.equals(head.data)))
return true;
head = head.next;
}
return false;
}
@Override
public boolean add(T ele) {
if (first == null)
first = last = new Node<T>(null, null, ele);
else {
//新添加节点的上一个节点是原来链表的最后一个节点
Node addNode = new Node(last, null, ele);
//原来链表的最后一个节点的下一个节点需要指向新添加的节点
last.next = addNode;
//更新最后一个节点为新添加的节点
last = addNode;
}
size++;
return true;
}
@Override
public boolean add(int index, T ele) {
checkBounds(index, true);
if (index == size) add(ele);
else {
Node head = first;
for (int i = 0; i < size; i++) {
if (i == index - 1)//得到要插入位置的前一个节点
head.next = new Node(head, head.next, ele);
else
head = head.next;
}
}
size++;
return true;
}
@Override
public boolean remove(T ele) {
if (!contains(ele))
return false;
Node head = first;
Node prev = head.prev;
while (head != null) {
if ((ele == null && ele == head.data) || ele.equals(head.data)) {
prev.next = head.next;
size--;
return true;
}
prev = head;
head = head.next;
}
return false;
}
@Override
public T remove(int index) {
checkBounds(index, false);
T removeEle = get(index);
remove(removeEle);
return removeEle;
}
@Override
public T get(int index) {
checkBounds(index, false);
if (index > (size >> 1)) {
//索引位置大于1/2size,从后往前
Node tail = last;
for (int i = size - 1; i >= 0; i--) {
if (i == index)
return (T) tail.data;
else
tail = tail.prev;
}
} else {
//从前往后
Node head = first;
for (int i = 0; i < size; i++) {
if (i == index)
return (T) head.data;
else
head = head.next;
}
}
return null;
}
@Override
public int indexOf(T ele) {
if (first == null) return -1;
Node head = first;
for (int i = 0; i < size; i++) {
if ((ele == null && ele == head.data) || ele.equals(head.data))
return i;
head = head.next;
}
return -1;
}
@Override
public boolean addAll(List<T> l) {
return false;
}
@Override
public Object[] toArray() {
return new Object[0];
}
/**
* 指定位置查找元素和插入元素到指定位置IndexOutofBounds的判断标准不一样
*
* @param index
* @param isInsert
*/
private void checkBounds(int index, boolean isInsert) {
if (isInsert && (index < 0 || index > size))//允许插入到最后一个元素之后,不能排除=
throw new IndexOutOfBoundsException("index : " + index + ", size : [ 0 - " + size + " ]");
if (index < 0 || index >= size)//查询从0 --- size-1
throw new IndexOutOfBoundsException("index : " + index + ", size : [ 0 - " + size + " ]");
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder("[ ");
Node head = first;
while (head != null) {
sb.append(head.data + " ");
head = head.next;
}
return sb.append("]").toString();
}
}