/**
*
*/
package org.le.list;
import java.util.NoSuchElementException;
/**
* @author yue
* @time 2017年2月19日
*/
public class LinkedList<E> implements List<E> {
private int size = 0;
private Node<E> first;
private Node<E> last;
private static class Node<E>{
E item;
Node<E> prev;
Node<E> next;
Node(Node<E> prev,E item, Node<E> next) {
super();
this.item = item;
this.prev = prev;
this.next = next;
}
}
public LinkedList(){
}
/**
* 头部插入
*/
private void linkFirst(E e){
final Node<E> f = first;
final Node<E> newNode = new Node<E>(null,e,f);
first = newNode;
if(f == null)
last = newNode;
else
f.prev = newNode;
size ++;
}
/**
* 尾部插入
*/
private void linkLast(E e){
final Node<E> l = last;
final Node<E> newNode = new Node<>(l,e,null);
last = newNode;
if(last == null)
first = newNode;
else
l.next = newNode;
size ++;
}
/**
* 某个不为null元素之前插入
*/
private void linkBefore(E e,Node<E> succ){
final Node<E> pred = succ.prev;
final Node<E> newNode = new Node<>(pred,e,succ);
succ.prev = newNode;
if(pred == null)
first = newNode;
else
pred.next = newNode;
size ++;
}
/**
* 删除头部元素
*/
private E unlinkFirst(Node<E> f){
final E element = f.item;
final Node<E> next = f.next;
f.item = null;
f.next = null;
first = next;
if(next == null)
last = null;
else
next.prev = null;
size -- ;
return element;
}
/**
* 删除尾部元素
* @param l
* @return
*/
private E unlinkLast(Node<E> l){
final E element = l.item;
final Node<E> prev = l.prev;
l.item = null;
l.prev = null;
last = prev;
if(prev == null)
first = null;
else
prev.next = null;
size -- ;
return element;
}
/**
* 删除指定节点
* @param e
* @return
*/
private E unlink(Node<E> e){
final Node<E> prev = e.prev;
final E element = e.item;
final Node<E> next = e.next;
if(prev == null){
first = next;
}else{
prev.next = next;
e.prev = null;
}
if(next == null){
last = prev;
}else{
next.prev = prev;
e.next = null;
}
e.item = null;
size -- ;
return element;
}
/**
* 该方法默认在尾部添加
*/
@Override
public void add(E e) {
linkLast(e);
}
/**
*
*/
@Override
public void add(int index, E e) {
checkPositionIndex(index);
if(index == size){
linkLast(e);
}else{
linkBefore(e, node(index));
}
}
private Node<E> node(int index) {
//小于容量一半
if(index < (size >> 1)){
Node<E> x = first;
for(int i = 0; i < index; i++){
x = x.next;
}
return x;
}else{
Node<E> x = last;
for(int i = size - 1; i > index; i --){
x = x.prev;
}
return x;
}
}
private void checkPositionIndex(int index){
if(index <0 || index > size){
throw new IndexOutOfBoundsException("索引越界:index:"+index+",size:"+size);
}
}
private void checkElementIndex(int index){
if(index <0 || index >= size){
throw new IndexOutOfBoundsException("索引越界:index:"+index+",size:"+size);
}
}
/**
*
*/
@Override
public void remove(E obj) {
if(obj == null){
for(Node<E> x = first;x != null; x = x.next){
if(x.item == null){
unlink(x);
}
}
}else{
for(Node<E> x = first;x != null;x = x.next){
if(obj.equals(x.item)){
unlink(x);
}
}
}
}
/**
*
*/
@Override
public E remove(int index) {
checkElementIndex(index);
return unlink(node(index));
}
/**
*
*/
@Override
public E get(int index) {
checkElementIndex(index);
return node(index).item;
}
/**
*
*/
@Override
public E set(int index, E obj) {
checkElementIndex(index);
Node<E> x = node(index);
E oldVal = x.item;
x.item = obj;
return oldVal;
}
/**
*
*/
@Override
public int indexOf(E obj) {
int index = 0;
if(obj == null){
for(Node<E> x = first;x != null;x = x.next){
if(x.item == null)
return index;
index ++;
}
}else{
for(Node<E> x = first; x != null; x = x.next){
if(obj.equals(x.item))
return index;
index ++;
}
}
return -1;
}
/**
* 弹出栈顶的元素,不删除元素
* @param e
* @return
*/
public E peek(){
final Node<E> e = first;
return e == null ? null : e.item;
}
/**
* 弹出栈顶元素,删除元素
* @return
*/
public E poll(){
final Node<E> e = first;
return (e == null) ? null : unlinkFirst(e);
}
/**
* 入栈,栈顶
* @param e
*/
public void push(E e){
linkFirst(e);
}
/**
* 出栈,删除并返回栈顶元素
* @return
*/
public E pop(){
final Node<E> f = first;
if(f == null)
throw new NoSuchElementException();
return unlinkFirst(f);
}
}