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

主要细节

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

例题

相关推荐
AlenTech1 天前
141. 环形链表 - 力扣(LeetCode)
数据结构·leetcode·链表
迈巴赫车主1 天前
蓝桥杯20560逃离高塔
java·开发语言·数据结构·算法·职场和发展·蓝桥杯
x_xbx1 天前
LeetCode:1. 两数之和
数据结构·算法·leetcode
玲娜贝儿--努力学习买大鸡腿版1 天前
hot 100 刷题记录(1)
数据结构·python·算法
努力中的编程者1 天前
二叉树(C语言底层实现)
c语言·开发语言·数据结构·c++·算法
宵时待雨1 天前
C++笔记归纳14:AVL树
开发语言·数据结构·c++·笔记·算法
山川行1 天前
关于《项目C语言》专栏的总结
c语言·开发语言·数据结构·vscode·python·算法·visual studio code
Yvonne爱编码1 天前
Java 中的 hashCode () 与 equals () 核心原理、契约规范、重写实践与面试全解
java·开发语言·数据结构·python·hash
月落归舟1 天前
排序算法---(一)
数据结构·算法·排序算法
今儿敲了吗1 天前
DS-3 循环队列判断队满
数据结构·笔记·学习