package com.coding.basic;
import java.util.ConcurrentModificationException;
import java.util.NoSuchElementException;
public class LinkedList implements List {
/**
* 当前节点的大小
*/
private int size;
/**
* 头节点
*/
private Node header;
/**
* 尾节点
*/
private Node end;
public void add(Object o){
if(header==null){
header = new Node();
header.data = o;
end = header;
}else{
Node n = new Node();
n.data = o;
end.next = n;
n.previous=end;
end = n;
}
size++;
}
public void add(int index,Object o){
judge(index);
Node n = new Node();
n.data = o;
Node temp = header;
for(int i = 0;i<index;i++){
temp = temp.next;//此时temp是index位置的原始节点
}
if(temp.previous!=null&&temp.next!=null){//前后节点不为空的时候
Node pe=temp.previous;
pe.next=n;
n.previous = pe;
n.next=temp;
temp.previous=n;
}else if(temp.previous==null){
header=n;
n.next=temp;
temp.previous=n;
}else if(temp.next==null){
n.previous=temp;
temp.next=n;
end=n;
}
size++;
}
public Object get(int index){
judge(index);
Node n = header;
for(int i = 0;i < index; i++){
n=n.next;
}
return n.data;
}
public Object remove(int index){
judge(index);
Node temp = header;
for(int i=0;i<index;i++){
temp = temp.next;
}
Object value = temp.data;
if(temp.previous!=null&&temp.next!=null){//前后节点不为空的时候
temp.next.previous=temp.previous;
temp.previous.next=temp.next;
}else if(temp.previous==null){
header=temp.next;
temp.next.previous = null;//消除当前对象的前链接
temp = null;//消除当前对象
}else if(temp.next==null){
end=temp.previous;
temp.previous.next = null;//消除当前对象的后连接
temp = null;//消除当前对象
}
size--;
return value;
}
public int size(){
return size;
}
public void addFirst(Object o){
Node n = new Node();
n.data = o;
header.previous = n;
n.next = header;
header=n;
size++;
}
public void addLast(Object o){
Node n = new Node();
n.data = o;
end.next = n;
n.previous=end;
end=n;
size++;
}
public Object removeFirst(){
Object value = header.data;
header.next.previous = null;
header=header.next;
size--;
return value;
}
public Object removeLast(){
Object value = end.data;
end.previous.next = null;
end=end.previous;
size--;
return value;
}
public Iterator iterator(){
return new LinkedListIterator();
}
private class LinkedListIterator implements Iterator{
int cursor;
int lastReset = -1;
@Override
public boolean hasNext() {
return size!=cursor;
}
@Override
public Object next() {
//标记索引当前位置
int i = cursor;
if(i>size){
throw new NoSuchElementException();
}
Node n = header;
for(int j = 0;j < i;j ++){
n = n.next;
}
cursor = i + 1;
lastReset = i;
return n.data;
}
}
/**
* 判断数组是否越界方法
*/
public void judge(int index){
if(index<0||index>=size){
throw new IndexOutOfBoundsException("数组越界");
}
}
/**
* @author sulei
*/
private static class Node{
Object data;//当前节点数据
Node next;//下一个节点
Node previous;//上一个节点
}
}