package task0228.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); } size++; } public void add(int index, Object o) { if (index < 0 || index > size) { throw new IndexOutOfBoundsException("index:" + index + "size:" + size); } Node node = head; if (index != 0) { // ���ǵ�һ������ֵ���ҵ�����ֵ��ǰ��һ���ڵ� for (int i = 1; i < index; i++) { node = node.next; } Node newNode = new Node(o, node.next); node.next = newNode; size++; } else { // ��һ������ֵ�ͽ�ͷ�ڵ�ָ���� Node newNode = new Node(o, head); head = newNode; size++; } } public Object get(int index) { indexCheck(index); Node node = head; for (int i = 1; i <= index; i++) { node = node.next; } return node.data; } public Object remove(int index) { indexCheck(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("size:" + size); } Object val = head.data; head = head.next; size--; return val; } public Object removeLast() { if (size <= 0) { throw new IndexOutOfBoundsException("size:" + size); } Node node = head; while (node.next != null) { node = node.next; } Object val = node.data; node = null; size--; return val; } public Iterator iterator() { return new MyIterator(this); } private class MyIterator implements Iterator{ private int poi = -1; private LinkedList list ; private MyIterator(LinkedList list) { this.list= list; } @Override public boolean hasNext() { // TODO Auto-generated method stub return (poi + 1) < list.size; } @Override public Object next() { // TODO Auto-generated method stub poi++; if (poi >= list.size) { poi--; throw new IndexOutOfBoundsException(); } return list.get(poi); } @Override public Object remove() { // TODO Auto-generated method stub if (poi < 0) { throw new NoSuchElementException(); } Object val = list.removeLast(); poi--; return val; } } private void indexCheck(int index) { if (index < 0 || index >= size) { throw new IndexOutOfBoundsException("index:" + index + "size:" + size); } } private static class Node { Object data; Node next; Node(Object data, Node next) { this.data = data; this.next = next; } } }