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

主要细节

  • 在数组中用0表示头指针,1表示尾部指针(双链表) ,使用len下一个插入的节点下标。
  • 定义val表示节点取值,nxt或l和r表示链表指向。
  • -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];
	}
}

例题

相关推荐
shehuiyuelaiyuehao10 小时前
算法56,重排链表
数据结构·算法·链表
suhan12 小时前
【数据结构】七、查找:1.查找的概念、线性结构查找(顺序、折半(二分)、插值、稠密、分块、倒排)
数据结构·算法·排序算法
极客 - L U12 小时前
卡尔曼滤波从零到精通
c语言·数据结构·单片机·嵌入式硬件·mcu
Sarvartha14 小时前
栈的四则运算、栈的递归应用
数据结构·算法
YXXY31315 小时前
链表的相关介绍
链表
GG.WinGel17 小时前
三元组中心问题
java·数据结构·算法·青少年编程·蓝桥杯
程序员清风17 小时前
缓存、索引与数据结构的工程选择
数据结构·spring·缓存
爱吃火鸡面呀18 小时前
Doris 数据划分实战:List 分区、分桶列与桶数选择
数据结构·list
BK贝壳1 天前
亿级用户签到位图选型复盘:用 bool-hybrid-array 扛冷启动打卡,也把它和 Roaring/Redis 的边界测清楚了
数据结构·python·性能优化·numpy
挖井观天1 天前
《Java数据结构》第一讲:顺序表
数据结构