public class LRUBaseLinkedList<T> {
private final static Integer DEFAULT_CAPACITY = 10;
private SNode<T> headNode;
private Integer length;
private Integer capacity;
public LRUBaseLinkedList() {
this.headNode = new SNode<>();
this.capacity = DEFAULT_CAPACITY;
this.length = 0;
}
public void add(T data) {
SNode preNode = findPreNode(data);
if (preNode != null) {
deleteElemOptim(preNode);
intsertElemAtBegin(data);
} else {
if (length >= this.capacity) {
deleteElemAtEnd();
}
intsertElemAtBegin(data);
}
}
private void deleteElemOptim(SNode preNode) {
SNode temp = preNode.getNext();
preNode.setNext(temp.getNext());
length--;
}
private void intsertElemAtBegin(T data) {
SNode next = headNode.getNext();
headNode.setNext(new SNode(data, next));
length++;
}
private SNode findPreNode(T data) {
SNode node = headNode;
while (node.getNext() != null) {
if (data.equals(node.getNext().getElement())) {
return node;
}
node = node.getNext();
}
return null;
}
private void deleteElemAtEnd() {
SNode ptr = headNode;
if (ptr.getNext() == null) {
return;
}
while (ptr.getNext().getNext() != null) {
ptr = ptr.getNext();
}
ptr.setNext(null);
length--;
}
private void printAll() {
SNode node = headNode.getNext();
while (node != null) {
System.out.print(node.getElement() + ",");
node = node.getNext();
}
System.out.println();
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SNode<T> {
private T element;
private SNode next;
}
public static void main(String[] args) {
LRUBaseLinkedList list = new LRUBaseLinkedList();
Scanner sc = new Scanner(System.in);
while (true) {
list.add(sc.nextInt());
list.printAll();
}
}
}