package com.coding.basic;
import java.util.NoSuchElementException;
public class LinkedList implements List {
private Node head;
private int size;
public void add(Object o){
//�ж���û��ͷ���
if(head == null)
head = new Node(o,null);
else {
Node newNode = head;
while(newNode.next != null){
newNode = newNode.next;
}
newNode.next = new Node(o,null);
}
}
public void add(int index , Object o){
//����±��Ƿ�Խ��
if(index < 0 || index > size){
throw new IndexOutOfBoundsException("index:" + index + "Խ�磻");
}
Node node = head;
//������ǵ�һ��ͷ���
if(index == 0){
Node newNode = new Node(o,head);
head = newNode;
size ++;
}
else{
for(int i = 1; i < index; i++){
node = node.next;
}
//��index������o�����ҽ�o��next�ڵ���Ϊnode.next
Node newNode = new Node(o, node.next);
node.next = newNode;
size++;
}
}
public Object get(int index){
//����±��Ƿ�Խ��
if(index < 0 || index > size){
throw new IndexOutOfBoundsException("index:" + index + "Խ�磻");
}
Node node = head;
for (int i = 1; i <= index; i++) {
node = node.next;
}
return node.data;
}
public Object remove(int index){
//����±��Ƿ�Խ��
if(index < 0 || index > size){
throw new IndexOutOfBoundsException("index:" + index + "Խ�磻");
}
Node node = head;
Node removeNode;
if (index == 0) {
//��һ���ڵ�ֱ�ӽ�ͷ�ڵ�ָ����һ���ڵ�
removeNode = head;
head = head.next;
}
else {
//�ҵ�����ֵ��ǰһ���ڵ�
for (int i = 1; i < index; i++) {
node = node.next;
}
removeNode = node.next;
//ǰһ���ڵ�ָ�룬ָ��ɾ���ڵ���ָ��Ľڵ�
node.next = removeNode.next;
}
size--;
return removeNode.data;
}
public int size(){
return size;
}
public void addFirst(Object o){
Node newNode = new Node(o, head.next);
head.next = newNode;
size++;
}
public void addLast(Object o){
add(o);
}
public Object removeFirst(){
if(size <= 0){
throw new IndexOutOfBoundsException("û��Ԫ�أ�");
}
Node node = head;
head = head.next;
size--;
return node.data;
}
public Object removeLast(){
if(size <= 0){
throw new IndexOutOfBoundsException("û��Ԫ�أ�");
}
Node node = head;
while(node.next != null){
node = node.next;
}
Object val = node.data;
node = null;
size--;
return val;
}
private static class Node{
Object data;
Node next;
Node(Object data, Node next) {
this.data = data;
this.next = next;
}
}
public Iterator iterator(){
return new Itr(this);
}
private class Itr implements Iterator{
private int l = -1;
private LinkedList list;
private Itr(LinkedList linkedList) {
// TODO Auto-generated constructor stub
this.list = list;
}
@Override
public boolean hasNext() {
// TODO Auto-generated method stub
return l < list.size - 1;
}
@Override
public Object next() {
// TODO Auto-generated method stub
l++;
if (l >= list.size) {
l--;
throw new IndexOutOfBoundsException();
}
return list.get(l);
}
@Override
public Object remove() {
// TODO Auto-generated method stub
if (l < 0) {
throw new NoSuchElementException();
}
Object val = list.removeLast();
l--;
return val;
}
}
}