package Collection;
import java.util.NoSuchElementException;
class Node<E> {
E item;
Node<E> next;
Node<E> prev;
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
public class TestLinkedList<E> {
Node<E> first;
Node<E> last;
public int size;
public TestLinkedList() {
size = 0;
}
public void addFirst(E e) {
final Node<E> f = first;
Node<E> newNode = new Node<>(null, e, f);
first = newNode;
if (f == null) {
last = newNode;
} else {
f.prev = first;
}
size++;
}
public void addLast(E e) {
final Node<E> l = last;
Node<E> newNode = new Node<E>(l, e, null);
last = newNode;
if (l == null) {
first = newNode;
} else {
l.next = last;
}
size++;
}
public E getFirst() {
final Node<E> f = first;
if (f == null)
throw new NoSuchElementException();
return f.item;
}
public E getLast() {
final Node<E> l = last;
if (l == null)
throw new NoSuchElementException();
return l.item;
}
public E get(int index) {
if (index < 0 || index >= size) {
try {
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
}
}
Node<E> f = first;
for (int i = 1; i <= index; i++) {
f = f.next;
}
return f.item;
}
public E removeFirst() {
final Node<E> f = first;
if (f == null) {
try {
throw new Exception();
} catch (Exception e1) {
e1.printStackTrace();
}
return null;
} else {
E e = f.item;
first = f.next;
f.next = null;
f.item = null;
size--;
return e;
}
}
public Node<E> getNode(int index) {
if (index < 0 || index >= size) {
try {
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
}
}
Node<E> f = first;
for (int i = 1; i <= index; i++) {
f = f.next;
}
return f;
}
public E remove(int index) {
if (index < 0 || index >= size) {
try {
throw new Exception();
} catch (Exception e) {
e.printStackTrace();
}
}
Node<E> node = getNode(index);
Node<E> prev = node.prev;
Node<E> next = node.next;
if(prev.item == null) {
first = next;
}else {
node.prev.next=next;
}
if(next.item == null) {
last = prev;
}else {
node.next.prev = prev;
}
E e =node.item;
node.item = null;
node.prev = null;
node.next = null;
size--;
return e;
}
public E removeLast() {
final Node<E> l = last;
if (l == null) {
try {
throw new Exception();
} catch (Exception e1) {
e1.printStackTrace();
}
}
E e = l.item;
last = l.prev;
l.prev = null;
l.item = null;
size--;
return e;
}
public static void main(String[] args) {
TestLinkedList<String> linklist = new TestLinkedList<>();
linklist.addFirst("string");
linklist.addFirst("linklist");
linklist.addLast("my");
linklist.addLast("first");
for (int i = 0; i < linklist.size; i++) {
System.out.println(linklist.get(i));
}
System.out.println("----------------------");
linklist.removeFirst();
linklist.removeLast();
for (int i = 0; i < linklist.size; i++) {
System.out.println(linklist.get(i));
}
System.out.println("----------------------");
System.out.println("remove: "+linklist.remove(0));
for (int i = 0; i < linklist.size; i++) {
System.out.println(linklist.get(i));
}
}
}