package com.xxt.DataStructure;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.function.Consumer;
/**
* Created by star on 2017/2/25.
*/
public class MyLinkedList<E> implements List{
public static class Node<E>{
E elementData;
Node<E> prerious;
Node<E> next;
public Node(Node<E> prerious , E elementData, Node<E> next) {
this.prerious = prerious;
this.elementData= elementData;
this.next = next;
}
}
private Node header;
private Node last;
private int size = 0;
//往最后一个节点添加元素
@Override
public void add(Object elementData) {
addBefore((E) elementData, last);
}
@Override
public void add(int index, Object elementData) {
addBefore((E) elementData, (index == size ? last : node(index)));
}
@Override
public Object get(int index) {
return node(index).elementData;
}
//获取index位置的节点
private Node<E> node(int index){
if(index < 0 || index > size){
throw new IndexOutOfBoundsException("数组下标越界"+size);
}
if(index < (size >> 1)){
Node<E> e = header;
for(int i = 0; i < index; i ++){
e = header.next;
return e;
}
}else {
Node<E> e = last;
for(int i = size - 1; i > index; i--){
e = last.prerious;
return e;
}
}
return null;
}
@Override
public Object remove(int index) {
if (index < 0 || index > size) {
throw new IndexOutOfBoundsException("inde :" + index);
}
return remove(node(index));
}
//返回被删除的节点
private Object remove(Node<E> e){
E movedElementData = e.elementData;
//被删除节点的上个节点指向该节点的下个节点
e.prerious.next = e.next;
//被删除节点的下个节点指向该节点的上个节点
e.next.prerious = e.prerious;
//将该节点置为空,让GC能够回收
e.next = e.prerious = null;
e.elementData = null;
//长度-1
size--;
return movedElementData;
}
@Override
public int size() {
return size;
}
public Object removeFirst(){
return remove(header.next);
}
public Object removeLast(){
return remove(last.prerious);
}
public Iterator iterator(){
return null;
}
//插入一个新的节点
private Node<E> addBefore(E e, Node<E> node){
Node<E> newNode = new Node<E>(node.prerious, e, node.next);
//将上个节点的next指向自己
newNode.prerious.next = newNode;
//将下个节点的previous指向自己
newNode.next.prerious = newNode;
size++;
return newNode;
}
}