package com.github.Ven13.coding2017.basic;
public class LinkedList implements List {
//��ʾ������ij���
private int size;
//�����ͷԪ��
private Node head;
//�����βԪ��
private Node tail;
//ʹ���ڲ�����ʵ�������ÿһ���ڵ㣬ÿ���ڵ���һ��ָ����һ��Ԫ�ص�next���Լ������data
private static class Node {
public Object data;
public Node next;
public Node(Object data) {
this.data = data;
}
}
//����Ĺ��췽��
public LinkedList() {
}
@Override
public void add(Object o) {
add(size, o);
}
@Override
public void add(int index, Object o) {
if(index == 0) {
addFirst(o);
} else {
if(index >= size) {
addLast(o);
} else {
Node node = head;
for (int i = 1; i < index; i++) {
head = head.next;
}
Node nextNode = node.next;
Node temp = new Node(o);
node.next = temp;
temp.next = nextNode;
size++;
}
}
}
//���ǰ��
public void addFirst(Object o) {
Node newNode = new Node(o);
newNode.next = head;
head = newNode;
size++;
if(tail == null) {
tail = head;
}
}
//��Ӻ���
public void addLast(Object o) {
if(tail == null) {
tail = head = new Node(o);
} else {
Node newNode = new Node(o);
tail.next = newNode;
tail = tail.next;
}
size++;
}
@Override
public Object get(int index) {
Node node = head;
for(int i = 0; i < index; i++) {
node = node.next;
}
return node.data;
}
@Override
public Object remove(int index) {
if(size == 0) {
throw new java.util.NoSuchElementException();
}
if(index == 0) {
Node node = head;
Node temp = node.next;
head = temp;
size--;
return node.data;
} else {
if(index >= size) {
throw new java.util.NoSuchElementException();
} else {
Node node = head;
for(int i = 1; i < index; i++) {
node = node.next;
}
Node temp = node.next;
node.next = temp.next;
size--;
return node.data;
}
}
}
@Override
public int size() {
return size;
}
public Object removeFirst() {
//ͨ��ͷָ�봴��ͷ�ڵ�
Node hNode = head;
if (hNode == null) {
throw new java.util.NoSuchElementException();
}
Node nNode = hNode.next;
Object element = hNode.data;
//�Ƴ�
hNode.data = null;
hNode.next = null;
head = nNode;
//�ж��Ƿ�Ϊβ�ڵ�
if (nNode == null) {
tail = null;
}else {
nNode = null;
}
size --;
return element;
}
public Object removeLast() {
return remove(size - 1);
}
public Iterator iterator() {
return new LinkedListIterator();
}
private class LinkedListIterator implements Iterator {
private Node node = head.next;
@Override
public boolean hasNext() {
return node != tail;
}
@Override
public Object next() {
if(!hasNext()) {
throw new java.util.NoSuchElementException();
}
Object nextData = node.data;
node = node.next;
return nextData;
}
}
}