package com.thread.utils.collections;
public class PriorityLinkedList<E extends Comparable<E>> {
private int size;
Node<E> first;
public PriorityLinkedList() {
this.first = null;
}
public int size() {
return size;
}
public boolean isEmpty() {
return size() == 0;
}
public PriorityLinkedList<E> addFirst(E e) {
Node<E> node = new Node<>(e);
Node<E> previous = null;
Node<E> current = first;
while (current != null && e.compareTo(current.value) > 0) {
previous = current;
current = current.next;
}
if (previous == null) {
first = node;
node.next = current;
} else {
previous.next = node;
node.next = current;
}
size++;
return this;
}
public static <E extends Comparable<E>> PriorityLinkedList<E> of(E... elements){
PriorityLinkedList list = new PriorityLinkedList<>();
if (elements.length>0){
for (E e:elements){
list.addFirst(e);
}
}
return list;
}
public E removeFirst() {
Node<E> node = first;
first = node.next;
size--;
return node.value;
}
static class Node<E> {
E value;
Node<E> next;
public Node(E value) {
this.value = value;
}
@Override
public String toString() {
if (this.value != null) {
return value.toString();
} else {
return null;
}
}
}
public static void main(String[] args) {
PriorityLinkedList list = PriorityLinkedList.of(10, 8, -1, 2, 6, 4, 3);
System.out.println(list);
}
}