双向链表(C++数组实现)

这篇博客介绍了如何使用C++数组实现双向链表,包括链表的概念、操作如删点和加点,以及一个开车旅行的例题。文章强调了双向链表的便利性,但并未涉及循环链表的特殊处理。
摘要由CSDN通过智能技术生成

概念

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。(百度


操作(以下红边为新加入的边,黑边为删除的边)

题外话- -由于窝不会用链表,所以才用数组实现的
用一个pre数组存储每一个节点的前驱(即前一个节点),next数组存储每一个节点的后驱(即后一个节点)。

删点

现在要将x节点删掉(如下图)。我们知道了x = pre [z] = next [y] , y = pre[x] , z = next[x]
。其实只用将 y 节点的 next(即y的后驱) 改为 z ,和 z 节点的 pre(即z的前驱) 改为 y 即可。
代码:

int a=pre[x],b=next[x];
next[a]=b,pre[b]=a;

在这里插入图片描述

加点

现在要将x加到y和z之间(如下图)。我们知道了y = pre[z] , z = next[y] 。现在要将 ynext(即y的后驱) 修改为 x ,将 zpre(即z的前驱) 改为 x , 将新加入的x的pre(前驱)记录为y,next(后驱)记录为z即可。
代码:

next[y]=x,pre[z]=z;
pre[x]=y,next[x]=z;

在这里插入图片描述


例题:开车旅行

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
int read(){
   
	int s=0,v=1;
	char c=getchar();
	while(c>'9'||c<'0'){
   
		if(c=='-') v=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9') s=s*10+c-'0',c=getchar();
	return s*v;
}
struct City{
   
	int h,bh;
	bool operator <(const City&rhs)const{
   
		return h<rhs.h;
	}
}city[100005];
int n,m,s,s0,h,H[100005],pre[100005],nex[100005],min1[100005],min2[100005],loc[100005];
ll st[2][2][100005][20];
double bi=1e15;
void work(int x,int w){
   
	if(pre[w]) min1[x]=city[pre[w]].bh;
	if(!pre[w]||nex[w]<=n&&city[w].h-city[pre[w]].h>city[nex[w]]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值