提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
由于双向链表学的不扎实,本次改天重更
1472. 设计浏览器历史记录
题目链接
思路
栈解法维护一个栈和一个游标,每次前进后退更改游标
题解
var BrowserHistory = function (homepage) {
const stack = [homepage];
let idx = 0;
return {
visit: (url) => stack[stack.length = ++idx] = url,
back: (steps) => stack[idx = Math.max(0, idx - steps)],
forward: (steps) => stack[idx = Math.min(stack.length - 1, idx + steps)]
}
};
430. 扁平化多级双向链表
题目链接
思路
使用深搜,先查找当前节点有没有子节点,若没有记录链表最后一个节点,若有处理子节点,继续深搜,连接child
题解
function flatten(head: Node | null): Node | null {
const dfs = (node) => {
let cur = node;
// 记录链表的最后一个节点
let last = null;
while (cur) {
let next = cur.next;
// 如果有子节点,那么首先处理子节点
if (cur.child) {
const childLast = dfs(cur.child);
next = cur.next;
// 将 node 与 child 相连
cur.next = cur.child;
cur.child.prev = cur;
// 如果 next 不为空,就将 last 与 next 相连
if (next != null) {
childLast.next = next;
next.prev = childLast;
}
// 将 child 置为空
cur.child = null;
last = childLast;
} else {
last = cur;
}
cur = next;
}
return last;
}
dfs(head);
return head;
};