Design Browser History — Doubly Linked List Implementation
Advertisement
Problem 249 · Design Browser History
Difficulty: Hard · Pattern: Doubly Linked List Design
Implement: BrowserHistory(homepage), visit(url), back(steps), forward(steps).
Solutions
# Python — DLL
class Node:
def __init__(self, url): self.url = url; self.prev = self.next = None
class BrowserHistory:
def __init__(self, homepage):
self.cur = Node(homepage)
def visit(self, url):
node = Node(url)
self.cur.next = node; node.prev = self.cur
self.cur = node # forward history cut
def back(self, steps):
while steps > 0 and self.cur.prev:
self.cur = self.cur.prev; steps -= 1
return self.cur.url
def forward(self, steps):
while steps > 0 and self.cur.next:
self.cur = self.cur.next; steps -= 1
return self.cur.url
// Java
class BrowserHistory {
class Node { String url; Node prev, next; Node(String u){url=u;} }
Node cur;
public BrowserHistory(String homepage) { cur = new Node(homepage); }
public void visit(String url) {
Node n = new Node(url); n.prev = cur; cur.next = n; cur = n;
}
public String back(int steps) {
while (steps-->0 && cur.prev!=null) cur=cur.prev; return cur.url;
}
public String forward(int steps) {
while (steps-->0 && cur.next!=null) cur=cur.next; return cur.url;
}
}
// C++
class BrowserHistory {
struct Node { string url; Node *prev=nullptr, *next=nullptr; Node(string u):url(u){} };
Node* cur;
public:
BrowserHistory(string homepage) { cur = new Node(homepage); }
void visit(string url) {
Node* n = new Node(url); n->prev=cur; cur->next=n; cur=n;
}
string back(int steps) {
while(steps-->0 && cur->prev) cur=cur->prev; return cur->url;
}
string forward(int steps) {
while(steps-->0 && cur->next) cur=cur->next; return cur->url;
}
};
Complexity
- visit: O(1)
- back/forward: O(steps)
- Space: O(n) history length
Advertisement