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

主要细节

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

例题

相关推荐
程序员老舅9 小时前
啃透 I2C 驱动开发,才算入门嵌入式 Linux 内核驱动
数据结构·驱动开发·b树·内核·嵌入式·嵌入式开发·i2c
lueluelue4710 小时前
LeetCode:链表
算法·leetcode·链表
橘子汽水16813 小时前
Leetcode 23,543合并K个升序链表,二叉树的直径
算法·leetcode·链表
青山木17 小时前
Hot 100 --- 搜索插入位置
java·数据结构·算法·leetcode
Livia要学习20 小时前
Python2和Python3字典底层原理
数据结构
青梅橘子皮20 小时前
STL---map/set... “家族“详解(从使用到底层)(1)
数据结构·算法
Adios79420 小时前
搜索二维矩阵 II
java·数据结构·算法
灵枢时代1 天前
小程序在生鲜配送行业,如何设计夜间预约和次日达的订单处理流程?
数据结构·人工智能·小程序
一条大祥脚1 天前
ABC468 扫描线|贡献法|二阶差分|线段树优化DP
数据结构·算法
普通攻击往后拉1 天前
Leetcode 206. 反转链表
算法·leetcode·链表