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

主要细节

  • 在数组中用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];
	}
}

例题

相关推荐
小肝一下1 小时前
2. 顺序表和链表
c语言·数据结构·c++·链表·dijkstra·依蕾娜·香香的依蕾娜
j7~1 小时前
【数据结构初阶】带头双向循环链表 (DSList) --增删查改完整实现详解
c语言·数据结构·链表·带头双向循环链表
石像鬼₧魂石1 小时前
贵州商会管理系统 —— 商协会数字化运营一站式平台
大数据·数据结构·物联网·eclipse·数据库架构
Java面试题总结1 小时前
区间树:反向映射的前置数据结构
java·前端·数据结构
想做小南娘,发现自己是女生喵11 小时前
【无标题】
数据结构·算法
凤凰院凶涛QAQ16 小时前
《Java版数据结构 & 集合类剖析》栈与队列:“push/pop 是栈的灵魂,offer/poll 是队列的骨架——四组 API,两种人生”
java·开发语言·数据结构
郝学胜-神的一滴16 小时前
算法实战:最小k个数——大顶堆的优雅解法
开发语言·数据结构·c++·python·程序人生·算法·排序算法
Irissgwe16 小时前
算法滑动窗口
数据结构·算法
LuminousCPP20 小时前
C 语言集中实践全记录:顺序表 + 单链表原理实现与通讯录项目实战【附可运行源码】
c语言·开发语言·数据结构·经验分享·笔记
兰令水20 小时前
hot100【acm版】【2026.7.13打卡-java版本】
java·开发语言·数据结构·算法·leetcode·面试