import java.util.Random;
import java.util.concurrent.TimeUnit;
class MyList<T> {
private static class Data<U> {
U value;
Data<U> prev;
Data<U> next;
Data(U value, Data<U> prev, Data<U> next) {
this.value = value;
this.prev = prev;
this.next = next;
}
}
private Data<T> front = null;
private Data<T> back = null;
private int size = 0;
void pushFront(T value) {
if(size == 0) {
back = front = new Data<T>(value, null, null);
}
else {
Data<T> x = new Data<T>(value, null, front);
front.prev = x;
front = x;
}
size++;
}
void pushBack(T value) {
if(size == 0) {
back = front = new Data<T>(value, null, null);
}
else {
Data<T> x = new Data<T>(value, back, null);
back.next = x;
back = x;
}
size++;
}
T getHead() {
if(size == 0)
return null;
T ret = front.value;
front = front.next;
size--;
return ret;
}
T getBack() {
if(size == 0)
return null;
T ret = back.value;
back = back.prev;
size--;
return ret;
}
}
public class Main {
public static void main(String[] args) {
new Thread(new Runnable(){
@Override
public void run() {
Random rand = new Random();
MyList<Integer> deque = new MyList<Integer>();
while(true) {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(rand.nextInt(5) <= 1) { //push
if(rand.nextBoolean())
deque.pushFront(rand.nextInt());
else
deque.pushBack(rand.nextInt());
}
else { //get
if(rand.nextBoolean()) {
System.out.println("Integer: " + deque.getHead());
}
else {
System.out.println("Integer: " + deque.getBack());
}
}
}
}
}).start();
new Thread(new Runnable(){
@Override
public void run() {
Random rand = new Random();
MyList<Double> deque = new MyList<Double>();
while(true) {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(rand.nextInt(5) <= 1) { //push
if(rand.nextBoolean())
deque.pushFront(rand.nextDouble());
else
deque.pushBack(rand.nextDouble());
}
else { //get
if(rand.nextBoolean()) {
System.out.println("========Double: " + deque.getHead());
}
else {
System.out.println("========Double: " + deque.getBack());
}
}
}
}
}).start();
}
}
/*
Integer: null
========Double: null
Integer: null
========Double: null
Integer: null
========Double: null
Integer: null
Integer: null
========Double: 0.8163364486645169
Integer: null
========Double: null
Integer: null
Integer: 1371855456
========Double: 0.8149725112586352
Integer: null
Integer: -953435326
========Double: 0.4998311221315688
========Double: 0.5474754850786306
Integer: 578019531
Integer: -354045382
========Double: 0.5350067820324665
========Double: 0.7138483138323032
========Double: 0.6447447887022895
========Double: 0.053940919224031436
Integer: 2082486061
========Double: null
Integer: -387340288
========Double: 0.16976522422818274
========Double: 0.9210004845217443
Integer: 868038834
========Double: 0.5761645596787701
========Double: 0.7307563570314314
Integer: -75060098
========Double: null
Integer: 1771556191
========Double: null
Integer: -1470240185
Integer: 1015857195
Integer: -1505552788
========Double: 0.5255897040260163
Integer: 1102310584
========Double: 0.48663361891226664
Integer: -602291716
========Double: 0.26022517734216233
Integer: 1017666170
Integer: null
========Double: 0.6486041724539308
Integer: null
========Double: null
========Double: 0.3668878512131296
========Double: null
Integer: -33712299
========Double: 0.725863123878524
========Double: 0.1854256915265613
Integer: 809072275
========Double: null
========Double: null
Integer: 1824153699
Integer: -852775118
========Double: 0.045929878967493565
========Double: null
========Double: 0.5353368785459315
Integer: 1834939393
========Double: 0.5326277759876461
========Double: null
========Double: null
Integer: -129412745
========Double: 0.9363331876013318
Integer: -1742464234
Integer: 586620012
========Double: 0.7314669283225262
Integer: 1501134279
========Double: 0.92433017435357
Integer: 651252226
Integer: -1958012352
========Double: 0.12361635752089006
Integer: -290270535
Integer: 360180197
========Double: 0.10842444797166106
Integer: 1086761151
Integer: -158051459
========Double: 0.9119231802305054
Integer: 85522900
========Double: 0.28806680700111675
Integer: -1502183055
Integer: -495227680
========Double: 0.16576320691926727
Integer: 105449582
========Double: 0.5895022182429307
Integer: -1701281597
========Double: 0.09522858591340799
Integer: null
Integer: null
========Double: 0.062226283830654205
Integer: 1859000929
*/