2022.6.17(双链表)
继续先写五月集训的内容
题目描述:
你有一个只支持单个标签页的 浏览器 ,最开始你浏览的网页是
homepage
,你可以访问其他的网站
url
,也可以在浏览历史中后退steps
步或前进steps
步。请你实现
BrowserHistory
类:
BrowserHistory(string homepage)
,用homepage
初始化浏览器类。void visit(string url)
从当前页跳转访问url
对应的页面 。执行此操作会把浏览历史前进的记录全部删除。string back(int steps)
在浏览历史中后退steps
步。如果你只能在浏览历史中后退至多x
步且steps > x
,那么你只后退x
步。请返回后退 至多steps
步以后的url
。string forward(int steps)
在浏览历史中前进steps
步。如果你只能在浏览历史中前进至多x
步且steps > x
,那么你只前进x
步。请返回前进 至多steps
步以后的url
。
我的题解:
//感觉栈会更加好写一点偷个懒
typedef struct {
char** stack[101];
int top;
int index;
} BrowserHistory;
BrowserHistory* browserHistoryCreate(char * homepage) {
BrowserHistory* obj=(BrowserHistory*)malloc(sizeof(BrowserHistory));
obj->top=-1;
obj->index=-1;
//放入
obj->stack[++obj->index]=homepage;
obj->top++;
return obj;
}
void browserHistoryVisit(BrowserHistory* obj, char * url) {
obj->stack[++obj->index]=url;
obj->top=obj->index;
}
char * browserHistoryBack(BrowserHistory* obj, int steps) {
while(steps>0){
if(obj->index>0){
obj->index--;
}
steps--;
}
return obj->stack[obj->index];
}
char * browserHistoryForward(BrowserHistory* obj, int steps) {
while(obj->index<obj->top&&steps>0){
obj->index++;
steps--;
}
return obj->stack[obj->index];
}
void browserHistoryFree(BrowserHistory* obj) {
free(obj);
}
/**
* Your BrowserHistory struct will be instantiated and called as such:
* BrowserHistory* obj = browserHistoryCreate(homepage);
* browserHistoryVisit(obj, url);
* char * param_2 = browserHistoryBack(obj, steps);
* char * param_3 = browserHistoryForward(obj, steps);
* browserHistoryFree(obj);
*/
我的思路:
初始化就是栈的初始化直接把受界面放入
其次是浏览,也就是把网页依次放入栈中记录访问过的网站
然后是回退多少步也就是从当前指针处一一往下移动呗,直到step=0退出
前进就是判断边界往上移动同时steps–
这题可能就是阅读起来长点,还是很简单的
题目描述:
你会得到一个双链表,其中包含的节点有一个下一个指针、一个前一个指针和一个额外的 子指针 。这个子
指针可能指向一个单独的双向链表,也包含这些特殊的节点。这些子列表可以有一个或多个自己的子列
表,以此类推,以生成如下面的示例所示的 多层数据结构
不打了到时候点开看把
我的题解:
/*
// Definition for a Node.
class Node {
public:
int val;
Node* prev;
Node* next;
Node* child;
};
*/
//深搜
class Solution {
public:
Node* dfs(Node* head) {
Node* last;
if(head==NULL){
return NULL;
}
if(head->child){
Node* node1=head->child;
Node* node2=head->next;
Node* node3=dfs(node1);
head->next=node1;
node1->prev=head;
head->child=NULL;
node3->next=node2;
if(!node2){
return node3;
}
node2->prev=node3;
last=dfs(node3);
}else{
if(!head->next){
return head;
}
last=dfs(head->next);
}
return last;
}
Node* flatten(Node* head){
dfs(head);
return head;
}
};
我的思路
其实横着看就是个二叉树,很容易就想到深搜;
然后就可以用递归的方式去做,因为递归跟栈一样有先进后出的特性;
所以因为本身要扁平化自然你的
child
也要扁平化,然后再把next街道扁平化后的child上,所以遇到child进入递归,child完成然后最后再到head出去。