当前位置: 首页 > news >正文

微信网站怎么收款做网站套路

微信网站怎么收款,做网站套路,重庆网站开发解决方案,云南旅游讲解 创建链表的方式 面试题会用到的,但是笔试题不会用的: // 单链表 struct ListNode {int val; // 节点上存储的元素ListNode *next; // 指向下一个节点的指针ListNode(int x) : val(x), next(NULL) {} // 节点的构造函数 }; 但是这种动态的方式…

讲解

创建链表的方式

面试题会用到的,但是笔试题不会用的:

// 单链表
struct ListNode {int val;  // 节点上存储的元素ListNode *next;  // 指向下一个节点的指针ListNode(int x) : val(x), next(NULL) {}  // 节点的构造函数
};

但是这种动态的方式会很麻烦,而且大多数情况下会超时。数组模拟一切,可以改进一下,用数组来模拟链表:

用数组模拟单链表

单链表最主要的方式是邻接表,邻接表最主要的功能是存储图和树。

单链表的结构图示如下:

头节点一开始指向一个空节点,每次都会往里新插入一个元素。每个点里面都会有两个值(val与next指针)。

接下来我们用e[N]表示某个点的值是多少,用ne[N]表示某个点的next指针指向的值是多少。这两者之间是用下标关联起来的。空节点的下标使用-1来表示。例子如下:

由此就提取出了链表在数组中的表达式。

初始化链表的写法:

// head 表示头节点的下标
// e[i] 表示节点i的值
// ne[i] 表示节点i的next指针指向的节点的下标值是多少
// idx 存储当前已经用到了哪个点
int head, idx, e[N], ne[N];// 初始化链表
void init() {// 头节点一开始指向空集head = -1;// 从0号点开始分配idx = 0;
}

将元素插到头节点后的写法

// 将x插到头节点
void add_to_head(int x) {e[idx] = x; // 将要插入的节点x存下来ne[idx] =  head; // 将插入节点的指针指向head指向的值head = idx; // 让head指针指向插入元素idx++; // idx位置已用过,就移到下一个位置
}

将元素插入到任意节点后的方法

// 将x插到下标为k的节点的后面
void add(int k, int x) {e[idx] = x; // 将要插入的节点x存下来ne[idx] =  ne[k]; // 将插入节点的指针指向k指向的值ne[k] = idx; // 让k指针指向插入元素idx++; // idx位置已用过,就移到下一个位置
}

将下标是k的点后面的点删掉的方法

// 将下标是k的点后面的点删掉
void remove(int k) {ne[k] = ne[ne[k]]; // 跳过两个指针就可以实现删除
}

用数组模拟双链表

双链表的作用是优化问题。双链表就是一个节点有两个指针,一个指向前,另一个指向后。

// 初始化
void init() {// 0表示左端点,1表示右端点r[0] = 1; l[1] = 0;idx = 2;
}

// 在下标是k的点右边插入x
void add(int k, int x) {e[idx] = x;r[idx] = r[x];l[idx] = k;l[r[k]] = idx;r[k] = idx;
}

// 删除第k个点
void remove(int k) {r[l[k]] = r[k];l[r[k]] = l[k];
}

模板题

826. 单链表 - AcWing题库

#include<bits/stdc++.h>
using namespace std;const int N = 100010;// head 表示头节点下标
// e[i] 表示节点i的值
// ne[i] 表示节点i的next指针指向的节点的下标值是多少
// idx 存储当前已经用到了哪个点
int head, idx, e[N], ne[N];// 初始化链表
void init() {// 头节点一开始指向空集head = -1;// 从0号节点开始分配idx = 0;
}// 将x插到头节点
void add_to_head(int x) {e[idx] = x; // 将要插入的节点x存下来ne[idx] = head; // 将插入节点的指针指向head指向的值head = idx; // 让head指针指向插入元素idx++; // idx位置已用过,就移到下一个位置
}// 将元素插入到任意节点后的方法
void add(int k, int x) {e[idx] = x;ne[idx] = ne[k];ne[k] = idx;idx++;
}// 将下标是k的点后面的点删掉的方法
void remove(int k) {ne[k] = ne[ne[k]]; // 跳过两个指针就可以实现删除
}int main() {int m;cin >> m;init();while(m--){int k, x;char op;cin >> op;if (op == 'H') {cin >> x;add_to_head(x);} else if (op == 'D'){cin >> k;// 注意:下标是从0开始if (!k)  head = ne[head];remove(k - 1);} else {cin >> k >> x;add(k - 1, x);}}for (int i = head; i != -1; i = ne[i]) cout << e[i] << ' ';cout << endl;return 0;
}

解释一下一个关键的地方:

if (!k) head = ne[head];   // 如果 k 是 0,就删除头节点
remove(k - 1);             // 否则删除第 k 个插入的数后面的节点

情况1:k == 0

if (!k) head = ne[head];
  • !k 就是 k == 0
  • head = ne[head]:把头指针指向原来的头的下一个
  • 相当于:跳过头节点,实现“删除头节点”

举例: 链表:6 → 5 → 4 → NULLhead = 2(假设6在2号盒子) 执行 D 0

  • head = ne[head] = ne[2] = 1(假设5在1号盒子)
  • 现在头变成1号盒子(5),6被删了

情况2:k > 0

remove(k - 1);
  • k-1 是“第k个插入的数”对应的下标
  • remove(k-1):删掉这个节点后面的节点

举例: D 2:删除第2个插入的数后面的数

  • 第2个插入的数 → 下标是 1
  • 调用 remove(1) → 把下标1的节点的下一个删掉

为什么不能统一用 remove(k-1) 处理 k=0

  • k=0 时,k-1 = -1
  • remove(-1) 会访问 ne[-1] → 越界!

所以必须单独处理 k=0 的情况。这里如果看不懂多看就行了。

827. 双链表 - AcWing题库

// 删除链表节点的逻辑实现
void remove(int k) {// 左边的右边直接等于右边r[l[k]] = r[k];// 右边的左边直接为左边l[r[k]] = l[k];
}

// 插入
void add(int k, int x) {e[idx] = x;r[idx] = r[k];l[idx] = k;l[r[idx]] = idx;r[k] = idx;idx++;
}

#include<bits/stdc++.h>
using namespace std;const int N = 100010;// 点存的值,左右指针,当前用到的下标
int e[N], l[N], r[N], idx;// 初始化
void init() {r[0] = 1, l[1] = 0;idx = 2;
}// 插入
void add(int k, int x) {e[idx] = x;r[idx] = r[k];l[idx] = k;l[r[k]] = idx;r[k] = idx;idx++;
}// 删除链表节点的逻辑实现
void remove(int k) {// 左边的右边直接等于右边r[l[k]] = r[k];// 右边的左边直接为左边l[r[k]] = l[k];
}int main() {int m;cin >> m;init();while (m--) {string op;int k, x;cin >> op;if (op == "L") {cin >> x;add(0, x);} else if (op == "R") {cin >> x;add(l[1], x);} else if (op == "D") {cin >> k;remove(k + 1);} else if (op == "IL") {add(l[k + 1], x);} else {cin >> k >> x;add(k + 1, x);}}for (int i = r[0]; i != 1; i = r[i]) {cout << e[i] << ' ';}cout << endl;return 0;
}

练习题

707. 设计链表 - 力扣(LeetCode)

http://www.dtcms.com/a/433684.html

相关文章:

  • 类似享设计的网站金融培训网站源码
  • 我想做网站 怎么做呢营销号视频生成器网页版
  • 网站的备案可以管几年正品购物平台哪个最好
  • 网站设计过程柳江网站建设
  • 内网网站建设软件wordpress制作视频站
  • 如何将网站内容做chm搜索引擎优化的意思
  • TP5.1做的网站首页被挂马原因撸撸撸做最好的导航网站
  • 电脑做系统哪个网站比较好用域名到期与网站打不开
  • asp.net做网站教程资兴市住房和城乡建设局网站
  • 网站制作公司dedecms微信公众号入口
  • 网站建设具体流程图学做网站论坛视频下载
  • 网站验证wordpress导航页面模板下载地址
  • 自己做ppt网站wordpress个性首页
  • 建设银行官网首页网站公告西安网站搭建建设定制
  • 杭州网站排名wordpress 获取子类
  • 福州网站定制公司对网站开发流程的认识
  • 产品如何做网站推广网站建设有哪些方面
  • 做个企业网网站怎么做义马网站建设电话
  • 四川企业网站模板步骤网站建设项目经费的报告
  • king cms网站建设做网站优化时 链接名称"首页"有必要添加nofollow吗?
  • 网站建设功能模块价格发广告推广平台
  • 建设银行内部学习网站苏州建设工程协会网站
  • 网站免费模块建设现金分期网站
  • 那些网站是vue做的美食网站建设合同范例
  • 网站换友链平台万网网站后台管理
  • 泉州网站排名北京建设集团网站
  • 物流网站 源码建工信息网
  • 设计网站推荐素材网站厦门网站优化公司
  • 个人网站介绍模板下载官方网站建设步骤
  • 在线电影网站开发WordPress源码带会员中心系统