package fr.upem.threads.tpnote;

public class ListMin {

  private static class Link {
    /* complete modifiers */ int element;
    /* complete modifiers */ Link next;
    Link(int element, Link next) {
      this.element = element;
      this.next = next;
    }
  }

  /* complete modifiers */ Link head;
  /* complete modifiers */ Link minNode;

  public ListMin(int element) {
    this.head = this.minNode = new Link(element, null);
  }

  public void addFirst(int element) {
    Link node = new Link(element, this.head);
    this.head = node;
    if(element < this.minNode.element) {
      this.minNode = node;
    }
  }

  public int getMin() {
    return minNode.element;
  }

  @Override
  public String toString() {
    StringBuilder sb = new StringBuilder("[");
    for(Link node = head; node!=null; node=node.next){
      sb.append(node.element);
      if(node == this.minNode)
        sb.append('*');
      sb.append(", ");            
    }
    sb.setLength(sb.length()-2);
    sb.append("]");
    return sb.toString();   
  }  

  public static void main(String[] args) {
    ListMin l = new ListMin(20);
    System.out.println(l);
    for(int i=19;i>=0;i--){
      final int j=i;
      new Thread(()-> {
          l.addFirst(j);
          System.out.println(l);
      }).start(); 
    }
  }
}
