package com.coding.basic; public class LinkedList implements List { private int size = 0; private Node headNode; private Node lastNode; public LinkedList() { headNode = new Node(); lastNode = new Node(); headNode.next = lastNode; lastNode.prev = headNode; } public void add(Object o) { Node node = new Node(); node.data = o; if (size == 0) { headNode.next = node; lastNode.prev = node; node.next = lastNode; node.prev = headNode; } else { Node tempLastNode = lastNode.prev; tempLastNode.next = node; node.next = lastNode; node.prev = tempLastNode; lastNode.prev = node; } size = size + 1; } public void add(int index, Object o) { checkRange(index); Node preNode = null; Node nextNode = null; for (int i = 0; i <= index; i++) { preNode = headNode.next; } nextNode = preNode.next; Node newNode = new Node(); newNode.data = o; preNode.next = newNode; nextNode.prev = newNode; newNode.next = nextNode; newNode.prev = preNode; } private String outOfBoundsMsg(int index) { return "Index: " + index + ", Size: " + size; } public void checkRange(int index) { if (index > size) { throw new IndexOutOfBoundsException(outOfBoundsMsg(index)); } } public Object get(int index) { checkRange(index); Node node = null; for (int i = 0; i <= index; i++) { node = headNode.next; } return node; } public Object remove(int index) { return null; } public int size() { return size; } public void addFirst(Object o) { Node oldFirstnode = headNode.next; Node node = new Node(); node.data = o; headNode.next = node; node.next = oldFirstnode; node.prev = headNode; oldFirstnode.prev = node; } public void addLast(Object o) { Node oldLastNode = lastNode.prev; Node node = new Node(); node.data = o; node.prev = oldLastNode; node.next = lastNode; oldLastNode.next = node; lastNode.prev = node; } public Object removeFirst() { Node firstNode = headNode.next; Node newFirstNode = firstNode.next; newFirstNode.prev = headNode; headNode.next = newFirstNode; return firstNode; } public Object removeLast() { Node lastOldNode = lastNode.prev; lastNode.prev = lastOldNode.prev; lastOldNode.prev.next = lastNode; return lastOldNode; } Iterator iterator = new MIterator(); public Iterator iterator() { return iterator; } @Override public String toString() { return super.toString(); } private static class Node { Object data; Node next; Node prev; } class MIterator implements Iterator { Node node; @Override public boolean hasNext() { if (node == null) { node = headNode.next; } if (!node.equals(lastNode)) { System.out.println("ture"); return true; } node = null; return false; } @Override public Object next() { if (node.equals(headNode)) { node = headNode.next; return node; } Node tempNode = node; node = node.next; if (node == null) { throw new IndexOutOfBoundsException("out of "); } return tempNode.data; } } }