数据结构·链表的数组实现

主要细节

  • 在数组中用0表示头指针,1表示尾部指针(双链表) ,使用len下一个插入的节点下标。
  • 定义val表示节点取值,nxtlr表示链表指向。
  • -1表示空节点

单链表

  • nxt数组必须初始化为全-1
  • 使用0表示头指针,新节点的下标从1开始。
  • add指的是在k结点之后插入新节点 ,remove指的是移除第k个节点下一个节点(单链表不支持删除当前节点)。
  • 节点k并非第k个位置的节点,而是添加时的顺序
cpp 复制代码
int m, val[100009], nxt[100009] = {-1}, len;
void init() {
	nxt[0] = -1;
	len = 1;
}
void add(int k, int x) {
	val[len] = x;
	nxt[len] = nxt[k];
	nxt[k] = len;
	len++;
}
void remove(int k) {//remove next item
	nxt[k] = nxt[nxt[k]];
}
void printout() {
	int cur = nxt[0];
	while (cur != -1) {
		cout << val[cur] << " ";
		cur = nxt[cur];
	}
}

例题

双链表

  • l和r数组必须初始化为全-1
  • 使用0表示头指针,1表示尾指针,新节点的下标从2开始
  • add指的是在k结点之后插入新节点 ,remove指的是移除第k个节点(双链表支持删除当前节点)。
  • 节点k并非第k个位置的节点,而是添加时的顺序。例如,删除第k个节点指的是下标为k+1个节点。
cpp 复制代码
int m, l[100009] = {-1}, r[100009] = { -1 }, val[100009],len;
void init() {
	l[1] = 0;
	r[0] = 1;
	len = 2;
}
void add(int k, int x) {
	val[len] = x;
	l[len] = k;
	r[len] = r[k];
	l[r[k]] = len;
	r[k] = len;
	len++;
}
void remove(int k) {
	r[l[k]] = r[k];
	l[r[k]] = l[k];
}
void printout() {
	int cur = r[0];
	while (cur != 1) {
		cout << val[cur] << " ";
		cur = r[cur];
	}
}

例题

相关推荐
变量未定义~10 分钟前
阶乘的约数和、斐波那契数列、数列区间最大值(ST表)
数据结构·算法
晚风予卿云月20 分钟前
二分算法练习
数据结构·c++·算法·竞赛·算法随笔
晚风予卿云月1 小时前
《二分答案》算法练习
数据结构·c++·算法·二分·竞赛·算法随笔
代码中介商2 小时前
哈希表:从O(1)查找到冲突解决全解析
数据结构·散列表
努力努力再努力wz2 小时前
【Qt入门系列】:QLabel控件详解:从文本显示到图片展示,再到内容布局与伙伴机制
android·开发语言·数据结构·数据库·c++·qt·mysql
散峰而望2 小时前
【算法练习】算法练习精选:从 Phone numbers 到 Decrease,覆盖字符串、模拟、图论思维题
数据结构·c++·算法·贪心算法·github·动态规划·图论
并不喜欢吃鱼2 小时前
从零开始 C++----- 十二【C++ 数据结构】map/set 全解析:从使用到红黑树底层模拟实现
开发语言·数据结构·c++
Lsk_Smion2 小时前
力扣实训 _ [33].搜索旋转排序数组 _ [92].翻转链表Ⅱ
java·数据结构·算法
Zhang~Ling2 小时前
二叉搜索树(BST)详解:插入、删除、查找与 Key/Value 实战场景
数据结构·c++·算法
8Qi82 小时前
LeetCode 76. 最小覆盖子串(Minimum Window Substring)
数据结构·算法·leetcode·滑动窗口·哈希表