六月集训第十三天-双链表

2022.6.17(双链表)

继续先写五月集训的内容

题目描述:

1472. 设计浏览器历史记录 - 力扣(LeetCode)

你有一个只支持单个标签页的 浏览器 ,最开始你浏览的网页是 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–

这题可能就是阅读起来长点,还是很简单的

在这里插入图片描述

题目描述:

430. 扁平化多级双向链表 - 力扣(LeetCode)

你会得到一个双链表,其中包含的节点有一个下一个指针、一个前一个指针和一个额外的 子指针 。这个子

指针可能指向一个单独的双向链表,也包含这些特殊的节点。这些子列表可以有一个或多个自己的子列

表,以此类推,以生成如下面的示例所示的 多层数据结构

不打了到时候点开看把

我的题解:
/*
// 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出去。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值