using System.Collections.Generic;
public static void Main()
var cache = new LRUCache(cacheSize);
private DoublyLinkedList pageList;
private Dictionary<int, Node> pageMap;
public LRUCache(int cacheSize){
this.cacheSize = cacheSize;
this.pageList = new DoublyLinkedList(cacheSize);
this.pageMap = new Dictionary<int, Node>();
public void accessPage(int pageNum){
if(pageMap.ContainsKey(pageNum)){
pageNode = pageMap[pageNum];
pageList.moveToStart(pageNode);
pageNode = new Node(pageNum);
if(pageList.currSize == pageList.size){
pageNode = pageList.addNode(pageNode);
pageMap.Add(pageNum, pageNode);
public void printCacheState(){
if(pageList.head == null) {
Node tmp = pageList.head;
if(tmp.prev != null){ Console.Write("(prev:" + tmp.prev.pageNumber + ") "); }
Console.Write(tmp.pageNumber + " ");
if(tmp.next != null){ Console.Write("(next:" + tmp.next.pageNumber + ") "); }
if(pageList.head != null) { Console.WriteLine("head:" + pageList.head.pageNumber);}
if(pageList.tail != null) { Console.WriteLine("tail:" + pageList.tail.pageNumber);}
public class DoublyLinkedList{
public DoublyLinkedList(int cacheSize){
public void removeLast(){
var tailPrev = tail.prev;
public void moveToStart(Node node){
public Node addNode(Node node){
public Node(int pageNum){
this.pageNumber = pageNum;