package main; import utils.ListUtils; public class LinkedList implements List { private Node head; private int size; private static class Node { private Object data; private Node next; } @Override public void add(Object o) { add(size, o); } @Override public void add(int index, Object o) { ListUtils.CheckIndexInRange(0, size, index); if (0==size) { head = new Node(); head.data = o; size++; return; } if (0 == index) { Node node = new Node(); node.data = o; node.next = head; head = node; size++; return; } if (index == size) { Node node = head; while (null != node.next) { node = node.next; } Node addNode = new Node(); addNode.data = o; node.next = addNode; size++; return; } Node node = head; for (int i = 0; i < index - 1; i++) { node = node.next; } Node addNode = new Node(); addNode.data = o; addNode.next = node.next; node.next = addNode; size++; } @Override public Object remove(int index) { ListUtils.CheckIndexInRange(0, size - 1, index); Node node = head; if (0 == index) { head = head.next; size--; return node.data; } for (int i = 0; i < index - 1; i++) { node = node.next; } Node removeNode = node.next; node.next = removeNode.next; size--; return removeNode.data; } @Override public Object get(int index) { ListUtils.CheckIndexInRange(0, size - 1, index); Node node = head; for (int i = 0; i < index; i++) { node = node.next; } return node.data; } @Override public int size() { return size; } public Iterator iterator() { return new Iterator() { private int cursor; @Override public boolean hasNext() { if (size > 0) { return cursor < size; } else { return false; } } @Override public Object next() { Object tag = get(cursor); cursor++; return tag; } }; } }