链表与邻接表

单链表来实现邻接表,邻接表本质上是n个链表

邻接表的应用:存储图,树

双链表:优化部分题目


链表的每个节点存储两个值:当前链表节点的val (e[])和下一个节点的地址ne[]

/* 
head 表示头节点的下标
e[i] 表示节点i的值
ne[i] 表示节点i的next指针是多少
idx 当前最大已经用到了哪个点,目的是为了方便后续添加新的链表
*/

int head;
int e[N];
int ne[N];
int idx;

void init(){
	head = -1; // 表示空集
	idx = 1; // 当前点可以从0号开始分配
}

void add_to_head(int x){ // 讲x插入头结点
	// 把新节点的指针,指向head指向的点
	ne[idx] = head;
	
	// 把x的值赋给这个链表
	e[idx] = x;
	
	// 讲head的指针删除,指向x的地址
	head = idx;
	
	// 这个点已经用过了,需要转移
	idx++;
}

void add(int k, int x){ // 一般插入,讲x插入到k节点的后面
	// 建立新的指针,指向k节点原本所指的位置
	ne[idx] = ne[k];
	
	// 插入k节点的后面,那么k的后面的就是现在这个要插入的节点
	ne[k] = idx;
	
	// 这个节点的值是x
	e[idx] = x;
	
	// 这个点已经用过了需要转移
	idx++;
}

void delete_node(int k){ // 将下标为k的后面的点删掉
	// 直接跳过k后面的点指向下一个点就可以了
	ne[k] = ne[ne[k]];
	
}

// 遍历
	for(int i = head; i != -1; i = ne[i]){
	    cout << e[i] << " ";
	}

(马上回来继续补充

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值