public class MyLinkedList { private Node head; private Node tail; private int size; public MyLinkedList() { head = null; tail = head; size = 0; } public void add(int val) { if (size == 0) { head = new Node(val); tail = head; } else { tail.next = new Node(val); tail = tail.next; } size++; } public void add(int index, int val) { if (index > size) { throw new RuntimeException("Out of range."); } else if (index == size) { add(val); } else if (index == 0) { Node temp = new Node(val); temp.next = head; head = temp; size++; } else { Node current = head; for (int i = 0; i < index - 1; i++) { current = current.next; } Node temp = new Node(val); temp.next = current.next; current.next = temp; size++; } } public int size() { return size; } public boolean isEmpty() { return size == 0; } public int get(int index) { if (index >= size) { throw new RuntimeException("Out of range"); } Node current = head; for (int i = 0; i < index; i++) { current = current.next; } return current.value; } public void clear() { head = null; tail = head; size = 0; } public int remove(int index) { int value = 0; if (index >= size) { throw new RuntimeException("Out of range"); } else if (index == 0) { value = head.value; head = head.next; size--; } else { Node current = head; for (int i = 0; i < index - 1; i++) { current = current.next; } value = current.next.value; current.next = current.next.next; if(index==size-1){ tail = current; } size--; } return value; } public void printList() { Node current = head; while (current != null) { System.out.print(current.value + "->"); current = current.next; } System.out.println(); } }