| Input Parameters |
Expected outputs |
| Browser History Simulation can be shown in following format:
|
“Page1->Page2->Page3->Page4->Page5 (Current Page)”.
|
| User’s current Position in the Browser History Simulation should be tagged by the tag:
|
“(Current Page)”.
|
User should have option to move to next page or previous page in the Browser History Simulation:
If User moves to previous page, Browser History Simulation should show:
|
Page1->Page2->Page3->Page4(Current Page)->Page5.
|
| If User again moves to previous page, Browser History Simulation should show:
|
Page1->Page2->Page3(Current Page)->Page4->Page5.
|
| If User again moves to previous page, Browser History Simulation should show:
|
Page1->Page2(Current Page)->Page3->Page4->Page5.
|
| If User again moves to next page, Browser History Simulation should show:
|
Page1->Page2->Page3(Current Page)->Page4->Page5.
|
| If user navigates to a new page from current page, all history nodes after current node should be deleted and new page should be added as next page after current page. Browser History Simulation should show:
|
Page1->Page2->Page3->Page6(Current Page). Page4 and Page5 will no longer be part of browser history after this operation.
|
| Initialize a DoubleLinkedList by the name of browserHistory and a DoubleLinkedListNode by the name of currentPage
|
| To simulate “Visit a new Page”, create a new DoubleLinkedListNode, add an integer page number to it as data value and add the node to the end of browserHistory DoubleLinkedList and set the new node as currentPage.
|
| To simulate “Visit Previous Page”, navigate to previous node of currentPage DoubleLinkedListNode using PrevNode link. Also set previous node as currentPage now. Handle special case of browserHistory being empty or currentPage not having any previous node.
|
| To simulate “Visit Next Page”, navigate to next node of currentPage DoubleLinkedListNode using nextNode link. Also set next node as currentPage now. Handle special case of browserHistory being empty or currentPage not having any next node.
|
| Print browserHistory after each operation.
|
Below fully running code can be copied and run on Eclipse or other Java IDEs. Refer the classname in code below. If the class name below is "A", save the code below to a file named A.java before running it.
Be sure to try your own test cases to enhance your understanding !
You can also tweak the code to optimize or add enhancements and custom features.
Note: For easier code execution and easier reference, the class below contains code for DoubleLInkedList and DoubleLinkedListNode as internal classes. Ideally both these classes should be separate public classes.
public class DoubleLinkedListBrowserHistory {
private int newPageCounter=0;
private DoubleLinkedListNode currentPageInBrowserHistory=null;
private DoubleLinkedList browserHistory=null;
public void doubleLinkedListBrowserHistory(int action) {
try {
switch(action) {
case 1://VISIT_NEW_PAGE
newPageCounter++;
if ((currentPageInBrowserHistory==null)||
((currentPageInBrowserHistory!=null)&&(currentPageInBrowserHistory.getNextNode()==null))){
browserHistory.addLast(newPageCounter);
currentPageInBrowserHistory=browserHistory.getLastNode();
printBrowserHistory(browserHistory,currentPageInBrowserHistory);
}else if ((currentPageInBrowserHistory!=null)&&(currentPageInBrowserHistory.getNextNode()!=null)) {
currentPageInBrowserHistory.getNextNode().setPreviousNode(null);
currentPageInBrowserHistory.setNextNode(null);
browserHistory.addLast(newPageCounter);
currentPageInBrowserHistory=browserHistory.getLastNode();
printBrowserHistory(browserHistory,currentPageInBrowserHistory);
}
break;
case 2: //VISIT_PREVIOUS_PAGE_IN_BR_HISTORY
if ((currentPageInBrowserHistory==null)||
((currentPageInBrowserHistory!=null)&&(currentPageInBrowserHistory.getPreviousNode()==null))) {
System.out.println("\n\n No Previous Page exists !\n");
printBrowserHistory(browserHistory,currentPageInBrowserHistory);
break;
}else {
currentPageInBrowserHistory=currentPageInBrowserHistory.getPreviousNode();
printBrowserHistory(browserHistory,currentPageInBrowserHistory);
}
break;
case 3: //VISIT_NEXT_PAGE_IN_BR_HISTORY
if ((currentPageInBrowserHistory==null)||
((currentPageInBrowserHistory!=null)&&(currentPageInBrowserHistory.getNextNode()==null))) {
System.out.println("\n\n No Next Page exists !\n");
printBrowserHistory(browserHistory,currentPageInBrowserHistory);
break;
}else {
currentPageInBrowserHistory=currentPageInBrowserHistory.getNextNode();
printBrowserHistory(browserHistory,currentPageInBrowserHistory);
}
break;
default: //user has input an option that is not available
System.out.print("\n Invalid option selected; please use one of the options given above: ");
break;
}
}catch (Exception exception) {
System.out.print("Exception: "+ exception);
}
}
// print DoubleLinkList forward direction
public static void printBrowserHistory(DoubleLinkedList browserHistory, DoubleLinkedListNode currentPageInBrowserHistory) throws Exception {
DoubleLinkedListNode firstNode=browserHistory.getFirstNode();
if (firstNode == null) { System.out.println("\n\n Browser History empty\n"); return; }
DoubleLinkedListNode currentNode=firstNode;
System.out.println();
System.out.println("**************************************************************************************************");
System.out.print("Current Browser History: ");
do {
System.out.print("Page"+currentNode.getNodeData());
if (currentNode==currentPageInBrowserHistory) {System.out.print("(Current Page)");}
if (currentNode.getNextNode()!=null) { System.out.print(" -> "); }
currentNode=currentNode.getNextNode();
} while( currentNode != null);
System.out.println();
System.out.println("**************************************************************************************************");
System.out.println();
Thread.sleep(2000);
return;
}
public static void main(String[] args) {
final int VISIT_NEW_PAGE=1;
final int VISIT_PREVIOUS_PAGE_IN_BR_HISTORY=2;
final int VISIT_NEXT_PAGE_IN_BR_HISTORY=3;
try {
DoubleLinkedListBrowserHistory doubleLinkedListBrowserHistory= new DoubleLinkedListBrowserHistory();
doubleLinkedListBrowserHistory.browserHistory=doubleLinkedListBrowserHistory.new DoubleLinkedList() ;
doubleLinkedListBrowserHistory.currentPageInBrowserHistory=doubleLinkedListBrowserHistory.browserHistory.getFirstNode();
doubleLinkedListBrowserHistory.newPageCounter=0;
System.out.print("Visit new page: ");
doubleLinkedListBrowserHistory.doubleLinkedListBrowserHistory(VISIT_NEW_PAGE);
System.out.print("Visit new page: ");
doubleLinkedListBrowserHistory.doubleLinkedListBrowserHistory(VISIT_NEW_PAGE);
System.out.print("Visit new page: ");
doubleLinkedListBrowserHistory.doubleLinkedListBrowserHistory(VISIT_NEW_PAGE);
System.out.print("Visit new page: ");
doubleLinkedListBrowserHistory.doubleLinkedListBrowserHistory(VISIT_NEW_PAGE);
System.out.print("Visit new page: ");
doubleLinkedListBrowserHistory.doubleLinkedListBrowserHistory(VISIT_NEW_PAGE);
System.out.print("Visit new page: ");
doubleLinkedListBrowserHistory.doubleLinkedListBrowserHistory(VISIT_NEW_PAGE);
System.out.print("Visit *previous page* in browser history: ");
doubleLinkedListBrowserHistory.doubleLinkedListBrowserHistory(VISIT_PREVIOUS_PAGE_IN_BR_HISTORY);
System.out.print("Visit *previous page* in browser history: ");
doubleLinkedListBrowserHistory.doubleLinkedListBrowserHistory(VISIT_PREVIOUS_PAGE_IN_BR_HISTORY);
System.out.print("Visit *next page* in browser history: ");
doubleLinkedListBrowserHistory.doubleLinkedListBrowserHistory(VISIT_NEXT_PAGE_IN_BR_HISTORY);
System.out.print("Visit *next page* in browser history: ");
doubleLinkedListBrowserHistory.doubleLinkedListBrowserHistory(VISIT_NEXT_PAGE_IN_BR_HISTORY);
System.out.print("Visit *previous page* in browser history: ");
doubleLinkedListBrowserHistory.doubleLinkedListBrowserHistory(VISIT_PREVIOUS_PAGE_IN_BR_HISTORY);
System.out.print("Visit *previous page* in browser history: ");
doubleLinkedListBrowserHistory.doubleLinkedListBrowserHistory(VISIT_PREVIOUS_PAGE_IN_BR_HISTORY);
System.out.print("Visit *previous page* in browser history: ");
doubleLinkedListBrowserHistory.doubleLinkedListBrowserHistory(VISIT_PREVIOUS_PAGE_IN_BR_HISTORY);
System.out.print("Visit new page: ");
doubleLinkedListBrowserHistory.doubleLinkedListBrowserHistory(VISIT_NEW_PAGE);
}catch (Exception exception) {
System.out.print("Exception: "+ exception);
}
}
class DoubleLinkedList {
private DoubleLinkedListNode firstNode=null;
public DoubleLinkedListNode getFirstNode() {
return firstNode;
}
public void setFirstNode(DoubleLinkedListNode firstNode) {
this.firstNode = firstNode;
}
public DoubleLinkedListNode getLastNode() {
DoubleLinkedListNode currentNode=firstNode;
DoubleLinkedListNode prevNode=null;
while (currentNode !=null) {
prevNode=currentNode;
currentNode=currentNode.getNextNode();
}
return prevNode;
}
public boolean addLast(int data){
DoubleLinkedListNode node=new DoubleLinkedListNode();
node.setNodeData(data);
if (firstNode==null) {
firstNode=node;
node.setNextNode(null);
node.setPreviousNode(null);
return true;
}
else {
DoubleLinkedListNode currentNode=firstNode;
while (currentNode.getNextNode()!=null) {currentNode=currentNode.getNextNode();}
node.setPreviousNode(currentNode);
currentNode.setNextNode(node);
node.setNextNode(null);
return true;
}
}
public boolean addFirst(int data){
DoubleLinkedListNode node=new DoubleLinkedListNode();
node.setNodeData(data);
if (firstNode==null) {
firstNode=node;
node.setNextNode(null);
node.setPreviousNode(null);
return true;
}else {
node.setNextNode(firstNode);
firstNode.setPreviousNode(node);
firstNode=node;
node.setPreviousNode(null);
return true;
}
}
public boolean add(int data, int pos){
int size=getSize();
if ((pos<0) || (pos > size)) { return false;}
if (pos==0) {
addFirst(data);
return true;
}
if (pos==size) {
addLast(data);
return true;
}
DoubleLinkedListNode node=new DoubleLinkedListNode();
node.setNodeData(data);
DoubleLinkedListNode currentNode=firstNode;
DoubleLinkedListNode prevNode=null;
int idx=0;
while (currentNode !=null) {
if ((idx==pos)){
node.setNextNode(prevNode.getNextNode());
prevNode.setNextNode(node);
//setup previous node linkages
node.getNextNode().setPreviousNode(node);
node.setPreviousNode(prevNode);
return true;
}
prevNode=currentNode;
currentNode=currentNode.getNextNode();
idx++;
}
return false;
}
public int getSize() {
DoubleLinkedListNode currentNode=firstNode;
int idx=0;
while (currentNode !=null) {
currentNode=currentNode.getNextNode();
idx++;
}
return idx;
}
public boolean removeFirst() {
if (firstNode == null) { return false; }
if (firstNode.getNextNode()==null) {
firstNode=null;
return true;
}
firstNode=firstNode.getNextNode();
firstNode.setPreviousNode(null);
return true;
}
public boolean removeLast() {
if (firstNode == null) { return false; }
DoubleLinkedListNode currentNode=firstNode;
DoubleLinkedListNode prevNode=null;
while (currentNode !=null) {
if (currentNode.getNextNode()==null) {
if (prevNode==null) {
firstNode=null;
return true;
}
prevNode.setNextNode(null);
currentNode.setPreviousNode(null);
return true;
}
prevNode=currentNode;
currentNode=currentNode.getNextNode();
}
return false;
}
public boolean remove(int data){
DoubleLinkedListNode currentNode=firstNode;
DoubleLinkedListNode prevNode=null;
while (currentNode !=null) {
if (currentNode.getNodeData() == data) {
if (prevNode==null) {
removeFirst();
return true;
}
if (currentNode.getNextNode()==null) {
removeLast();
return true;
}
prevNode.setNextNode(currentNode.getNextNode());
prevNode.getNextNode().setPreviousNode(prevNode);
return true;
}
prevNode=currentNode;
currentNode=currentNode.getNextNode();
}
return false;
}
public boolean removeAtPos(int pos){
DoubleLinkedListNode currentNode=firstNode;
DoubleLinkedListNode prevNode=null;
int idx=0;
while (currentNode !=null) {
if (idx==pos) {
if (prevNode==null) {
removeFirst();
return true;
}
if (currentNode.getNextNode()==null) {
removeLast();
return true;
}
prevNode.setNextNode(currentNode.getNextNode());
return true;
}
prevNode=currentNode;
currentNode=currentNode.getNextNode();
idx++;
}
return false;
}
public int get(int idx) {
DoubleLinkedListNode currentNode=firstNode;
int currIdx=0;
while (currentNode !=null) {
if (currIdx==idx) {return currentNode.getNodeData();}
currentNode=currentNode.getNextNode();
currIdx++;
}
return Integer.MIN_VALUE;
}
public void traverseForward() {
DoubleLinkedListNode currentNode=firstNode;
while (currentNode !=null) {
System.out.println(currentNode.getNodeData());
currentNode=currentNode.getNextNode();
}
}
// print DoubleLinkList forward direction
public void printDoubleLinkListForwardDirection() throws Exception {
// Case 1: The Linked list is empty !!
if (firstNode == null) { System.out.println("Double Linked list empty"); return; }
// Case 2: Print Double LinkedList node by node (first to last)
DoubleLinkedListNode currentNode=firstNode;
System.out.println();
System.out.println("****************************************************************************");
System.out.print("DoubleLinkedList nodes (first node to last node): ");
do {
System.out.print(currentNode.getNodeData());
if (currentNode.getNextNode()!=null) System.out.print(" -> ");
currentNode=currentNode.getNextNode();
} while( currentNode != null);
System.out.println();
System.out.println("****************************************************************************");
System.out.println();
Thread.sleep(2000);
;
return;
}
// print DoubleLinkList backward direction
public void printDoubleLinkListBackwardDirection() throws Exception {
// Case 1: The Linked list is empty !!
if (firstNode == null) { System.out.println("Double Linked list empty"); return; }
// Case 2: Print Double LinkedList node by node (last to first)
// This while loop executes till we reach last node in the LinkedList
DoubleLinkedListNode currentNode=firstNode;
while (currentNode.getNextNode()!=null) {currentNode=currentNode.getNextNode();}
//currentNode is at end of LinkedList
System.out.println();
System.out.println("****************************************************************************");
System.out.print("DoubleLinkedList nodes (last node to first node): ");
do {
System.out.print(currentNode.getNodeData());
if (currentNode != firstNode) System.out.print(" -> ");
currentNode=currentNode.getPreviousNode();
} while( currentNode != null);
System.out.println();
System.out.println("****************************************************************************");
System.out.println();
Thread.sleep(2000);
;
return;
}
}
class DoubleLinkedListNode {
private DoubleLinkedListNode nextNode=null;
private DoubleLinkedListNode previousNode=null;
private int nodeData=0;
public DoubleLinkedListNode getNextNode() {
return nextNode;
}
public void setNextNode(DoubleLinkedListNode nextNode) {
this.nextNode = nextNode;
}
public DoubleLinkedListNode getPreviousNode() {
return previousNode;
}
public void setPreviousNode(DoubleLinkedListNode previousNode) {
this.previousNode = previousNode;
}
public int getNodeData() {
return nodeData;
}
public void setNodeData(int nodeData) {
this.nodeData = nodeData;
}
}
}