package src; /** * Created by Yang on 2/25/2017. */ public class MyLinkedList implements MyList { private int size = 0; private Node header; @Override public void add(Object obj) { Node newNode = new Node(obj); newNode.next = header; header = newNode; size++; } @Override public void add(int index, Object obj) { this.validIndex(index); Node current = this.getCurrentNode(index); Node newNode = new Node(obj); newNode.next = current.next; current.next = newNode; size++; } @Override public Object get(int index) { this.validIndex(index); Node node = getCurrentNode(index); return node.data; } @Override public Object remove(int index) { this.validIndex(index); if(index == 0) return removeFirst(); if(index == size -1) return removeLast(); Node node = getCurrentNode(index+1); node.next = node.next.next; size--; return node.data; } @Override public int size() { return size; } private static class Node { Object data; Node next; public Node(){ } public Node(Object data) { this.data = data; } } private void validIndex(int inputIndex) { if(inputIndex > size || inputIndex < 0){ throw new RuntimeException("Index: " + inputIndex + " out of bounds( " + size +" )"); } } private Node getCurrentNode(int index) { Node current = header; for(int i = 0; i < size-index -1; i++){ current = current.next; } return current; } public Object removeFirst() { Node temp = new Node(); temp.next = header; temp.next = header.next; return temp.next; } private Object removeLast() { Node preNode = new Node(); while (preNode.next.next != null) { preNode = preNode.next; } Node lastNode = preNode.next.next; preNode.next = null; return lastNode; } public void addLast(Object o){ Node preNode = new Node(); while (preNode.next != null){ preNode = preNode.next; } Node lastNode = new Node(o); preNode.next = lastNode; } public boolean isEmpty() { if (size() == 0){ return false; } return true; } }