package com.work.week01;
import java.io.Serializable;
public class MyLinkedList<E> implements MyList<E>, Serializable{
private static final long serialVersionUID = 8700137302944494769L;
transient int size = 0;
transient MyNode<E> head;
transient MyNode<E> last;
public MyLinkedList(){
head = new MyNode<E>(null, null);
last = new MyNode<E>(null, null);
}
@Override
public boolean add(E element) {
if(head.element == null){
head = new MyNode<E>(element, null);
last = head;
}else{
MyNode<E> node = new MyNode<E>(element, null);
last.next = node;
last = node;
}
size++;
return true;
}
@Override
public void add(int index, E element) {
if(index < 0 || index -size > 0){
throw new IndexOutOfBoundsException("����������");
}
if(index == 0){
MyNode<E> node = new MyNode<E>(element, null);
node.next = head;
head = node;
}else{
MyNode<E> leftNode = getIndexNode(index-1);
MyNode<E> node = new MyNode<E>(element, null);
node.next = leftNode.next;
leftNode.next = node;
}
size++;
}
private MyNode<E> getIndexNode(int index){
MyNode<E> node = head;
for(int i=0; i<index; i++){
node = node.next;
}
return node;
}
@Override
public E get(int index) {
if(index < 0 || index - size >= 0){
throw new IndexOutOfBoundsException("����������");
}
MyNode<E> node = getIndexNode(index);
return node.element;
}
@Override
public E remove(int index) {
if(index < 0 || index >= size){
throw new IndexOutOfBoundsException("����������");
}
if(index == 0){//�Ƴ�ͷ���
MyNode<E> node = head;
head = head.next;
node.next = null;
size--;
return node.element;
}else{
MyNode<E> leftNode = getIndexNode(index-1);
MyNode<E> node = leftNode.next; //���Ƴ��Ľڵ�
leftNode.next = node.next;
node.next = null;
size--;
return node.element;
}
}
@Override
public int size() {
return size;
}
@Override
public boolean isEmpty() {
return size == 0;
}
public void addFirst(E element){
add(0, element);
}
public void addLast(E element){
add(size, element);
}
public void removeFirst(){
remove(0);
}
public void removeLast(){
remove(size-1);
}
private static class MyNode<E>{
E element;
MyNode<E> next;
MyNode(E element, MyNode<E> next) {
this.element = element;
this.next = next;
}
}
@Override
public MyIterator<E> iterator() {
return new MyIter();
}
private class MyIter implements MyIterator<E>{
int flag = 0;
public MyIter(){
flag = size;
}
@Override
public boolean hasNext() {
return flag > 0;
}
@Override
public E next() {
if(!hasNext()){
throw new IndexOutOfBoundsException("����ֵ��������Χ");
}
return get(size-(flag--));
}
}
public static void main(String[] args) {
MyLinkedList<String> link = new MyLinkedList<String>();
link.add("1");
link.add("2");
link.add("3");
link.add("4");
link.add(3, "1");
link.removeFirst();
System.out.println("size="+link.size());
MyIterator<String> itr = link.iterator();
while(itr.hasNext()){
System.out.println(itr.next());
}
link.remove(4);
}
}