package com.mycoding;
import java.util.NoSuchElementException;
public class LinkedList implements List {
private Node head;
private int size;
public LinkedList() {
this.head = null;
this.size = 0;
}
//添加新元素
public void add(Object o){
Node newNode = new Node(o);
if(head == null) {
head = newNode;
} else {
Node nextNode = head;
while(nextNode.next != null) {
nextNode = nextNode.next;
}
nextNode.next = new Node(o);
}
size++;
}
//在指定位置添加新元素
public void add(int index , Object o){
checkAddElementIndex(index);
Node addNode = head;
if(index == 0) {
addFirst(o);
} else {
for(int i=0;i<index-1;i++) {
addNode = addNode.next;
}
Node insertNode = new Node(o);
insertNode.next = addNode.next;
addNode.next = insertNode;
size++;
}
}
public Object get(int index){
checkGetElementIndex(index);
Node getNode = head;
for(int i=0;i<index;i++) {
getNode = getNode.next;
}
return getNode.data;
}
public Object remove(int index){
checkGetElementIndex(index);
Node indexNode = head;
if(index == 0) {
Node laterNode = head;
while (indexNode.next != null) {
laterNode.data = indexNode.next.data;
laterNode = laterNode.next;
indexNode = indexNode.next;
}
size--;
return laterNode.data;
} else {
if(index > 0 && index < size()) {
for (int i=0;i<index-1;i++) {
indexNode = indexNode.next;
}
indexNode.next = indexNode.next.next;
size--;
}
return indexNode.data;
}
}
public int size(){
return size;
}
public void addFirst(Object o){
Node addFirstNode = new Node(o);
addFirstNode.next = head;
head = addFirstNode;
size++;
}
public void addLast(Object o){
add(o);
}
public Object removeFirst(){
isEmpty();
return remove(0);
}
public Object removeLast(){
return remove(size()-1);
}
public Iterator iterator(){
return new LinkedListIterator(this);
}
private class LinkedListIterator implements Iterator {
@SuppressWarnings("unused")
LinkedList linked = null;
int cursor=0;
private LinkedListIterator(LinkedList linked) {
this.linked = linked;
}
@Override
public boolean hasNext() {
return cursor < size;
}
@Override
public Object next() {
if(!hasNext()) {
throw new NoSuchElementException();
}
return get(cursor++);
}
}
public void checkGetElementIndex(int index) {
if (index < 0 || index >= size()){
throw new IndexOutOfBoundsException();
}
}
public void checkAddElementIndex(int index) {
if (index < 0 || index > size()) {
throw new IndexOutOfBoundsException();
}
}
public void isEmpty() {
if(head == null) {
throw new NoSuchElementException();
}
}
private static class Node{
Object data;
Node next;
public Node(Object o){
data = o;
next = null;
}
}
@Override
public String toString() {
StringBuffer str = new StringBuffer();
str.append("[");
for(int i=0; i<size; i++){
str.append( this.get(i) + ",");
}
str.deleteCharAt(str.length()-1);
str.append("]");
return str.toString();
}
}