package com.coding.basic;
import jdk.nashorn.internal.ir.ReturnNode;
import java.lang.reflect.Array;
import java.util.NoSuchElementException;
public class LinkedList<E> implements List<E> {
private Node head;//链表的头
private Node tail;//链表的结尾
private int size;//记录当前元素的size
public void add(E e) {
Node node = new Node(e);
if (head == null) {
head = node;
} else {
tail.next = node;
}
tail = node;
tail.next = null;
size++;
}
private void checkIndexRange(int index) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException();
}
}
public void add(int index, E e) {
checkIndexRange(index);
Node node = new Node(e);
Node temp = head;
Node temp2 = null;
for (int i = 0; i < index - 1; i++) {
temp = temp.next;
}
temp2 = temp.next;
temp.next = node;
node.next = temp2;
size++;
}
@Override
public E get(int index) {
checkIndexRange(index);
Node temp = head;
for (int i = 0; i < index; i++) {
temp = temp.next;
}
return (E) temp.data;
}
@Override
public E remove(int index) {
checkIndexRange(index);
if (index == 0) {
E e = removeFirst();
return e;
}
if (index == size - 1) {
E e = removeLast();
return e;
}
Node temp = head;
for (int i = 0; i < index - 1; i++) {
temp = temp.next;
}
E e = (E) temp.next.data;
temp.next = temp.next.next;
size--;
return e;
}
public int size() {
return size;
}
@Override
public boolean isEmpty() {
return size == 0;
}
public void addFirst(E e) {
Node node = new Node(e);
node.next = head;
head = node;
size++;
}
public void addLast(E e) {
this.add(e);
}
public E removeFirst() {
E e = (E) head.data;
head = head.next;
size--;
return e;
}
public E removeLast() {
Node temp = head;
for (int i = 0; i < size - 1; i++) {
temp = temp.next;
}
temp.next = null;
E e = (E) tail.data;
tail = temp;
size--;
return e;
}
public Iterator iterator() {
return new LinkedListIterator(this);
}
private static class Node<E> {
E data;
Node next;
public Node(E e) {
this.data = e;
}
}
private class LinkedListIterator<E> implements Iterator{
private Node head;//链表的头
private Node tail;//链表的结尾
private Node node;//当前遍历的node
private int index;
private int endIndex;
public LinkedListIterator(LinkedList list){
this.head=list.head;
this.tail=list.tail;
this.endIndex = list.size() - 1;
node=head;
}
@Override
public boolean hasNext() {
return this.index < this.endIndex;
}
@Override
public E next() {
if(!this.hasNext()) {
throw new NoSuchElementException();//没有元素了
} else {
if(index == 0){
node = head;
}else {
node = node.next;
}
index++;
return (E)node.data;
}
}
}
}