package list;
public interface MyList<E> {
public boolean add(E e);
public void add(int index, E element);
public void clear();
public boolean contains(Object o);
public E get(int index);
public int indexOf(Object o);
public boolean isEmpty();
public int lastIndexOf(Object o);
public E remove(int index);
public boolean remove(Object o);
public E set(int index, E element);
public int size();
}
package list;
public interface MyList<E> {
public boolean add(E e);
public void add(int index, E element);
public void clear();
public boolean contains(Object o);
public E get(int index);
public int indexOf(Object o);
public boolean isEmpty();
public int lastIndexOf(Object o);
public E remove(int index);
public boolean remove(Object o);
public E set(int index, E element);
public int size();
}
package list;
import java.util.NoSuchElementException;
public class MyLinkedList<E> implements MyList<E>, MyDeque<E>{
private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
Node(Node<E> prev, E item, Node<E> next) {
this.prev = prev;
this.item = item;
this.next = next;
}
}
private int size;
private Node<E> first = null;
private Node<E> last = null;
@Override
public boolean add(E e) {
Node<E> l = last;
Node<E> newNode = new Node<>(l, e, null);
last = newNode;
if(l == null)
first = newNode;
else
l.next = newNode;
size++;
return true;
}
@Override
public void add(int index, E element) {
checkElementIndex(index);
if(index == size) {
Node<E> l = last;
Node<E> newNode = new Node<>(l, element, null);
last = newNode;
if(l == null)
first = newNode;
else
l.next = newNode;
size++;
}else {
Node<E> x = node(index);
Node<E> prev = x.prev;
Node<E> newNode = new Node<>(prev, element, x);
x.prev = newNode;
if(prev == null)
first = newNode;
else prev.next = newNode;
size++;
}
}
@Override
public void clear() {
for(Node<E> x = first; x != null; ) {
Node<E> next = x.next;
x.prev = null;
x.item = null;
x.next = null;
x = next;
}
first = last = null;
size = 0;
}
@Override
public boolean contains(Object o) {
return indexOf(o) != -1;
}
@Override
public E get(int index) {
checkElementIndex(index);
return node(index).item;
}
@Override
public int indexOf(Object o) {
int index = 0;
for(Node<E> x = first; x != null; x = x.next) {
if(o.equals(x.item))
return index;
index++;
}
return -1;
}
@Override
public boolean isEmpty() {
return size == 0;
}
@Override
public int lastIndexOf(Object o) {
int index = size;
for(Node<E> x = last; x != null; x = x.prev) {
index--;
if(o.equals(x.item))
return index;
}
return -1;
}
@Override
public E remove(int index) {
checkElementIndex(index);
Node<E> x = node(index);
E element = x.item;
Node<E> next = x.next;
Node<E> prev = x.prev;
if(prev == null) {
first = null;
}else {
prev.next = next;
x.prev = null;
}
if(next == null) {
last = prev;
}else {
next.prev = prev;
x.next = null;
}
size--;
return element;
}
@Override
public boolean remove(Object o) {
for(Node<E> x = first; x != null; x = x.next) {
if(o.equals(x.item)) {
Node<E> next = x.next;
Node<E> prev = x.prev;
if(prev == null) {
first = null;
}else {
prev.next = next;
x.prev = null;
}
if(next == null) {
last = prev;
x.next = null;
}
x.item = null;
size--;
return true;
}
}
return false;
}
@Override
public E set(int index, E element) {
checkElementIndex(index);
Node<E> x = node(index);
E oldItem = x.item;
x.item = element;
return oldItem;
}
@Override
public int size() {
return size;
}
@Override
public void addFirst(E e) {
Node<E> f = first;
Node<E> newNode = new Node<>(null, e, f);
first = newNode;
if(f == null)
last = newNode;
else
f.prev = newNode;
size++;
}
@Override
public void addLast(E e) {
Node<E> l = last;
Node<E> newNode = new Node<>(l, e, null);
last = newNode;
if(l == null)
first = newNode;
else {
l.next = newNode;
}
size++;
}
@Override
public E element() {
return getFirst();
}
@Override
public E getFirst() {
Node<E> f = first;
if(f == null)
throw new NoSuchElementException();
return f.item;
}
@Override
public E getLast() {
Node<E> l = last;
if(l == null)
throw new NoSuchElementException();
return l.item;
}
@Override
public E peek() {
Node<E> f = first;
return (f == null) ? null : f.item;
}
@Override
public E peekFirst() {
Node<E> f = first;
return (f == null) ? null : f.item;
}
@Override
public E peekLast() {
Node<E> l = last;
return (l == null) ? null : l.item;
}
@Override
public E pop() {
return removeFirst();
}
@Override
public void push(E e) {
addFirst(e);
}
@Override
public E remove() {
return removeFirst();
}
@Override
public E removeFirst() {
Node<E> f = first;
if(f == null)
throw new NoSuchElementException();
E element = f.item;
Node<E> next = f.next;
f.item = null;
f.next = null;
first = next;
if(next == null)
last = null;
else
next.prev = null;
size--;
return element;
}
@Override
public E removeLast() {
Node<E> l = last;
if(l == null)
throw new NoSuchElementException();
E element = l.item;
Node<E> prev = l.prev;
l.item = null;
l.prev = null;
last = prev;
if(prev == null)
first = null;
else
prev.next = null;
size--;
return element;
}
public void checkElementIndex(int index) {
if(index < 0 || index >= size)
throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
}
private Node<E> node(int index) {
Node<E> x = first;
for(int i = 0; i < index; i++)
x = x.next;
return x;
}
public static void main(String[] args) {
}
}