单链表模板+例题

题目

链接在这里!!AcWing 826. 单链表 - AcWing

涉及变量

int head, e[N],ne[N],idx,m,k,x;
char order;

head: 头指针

e[N]:链表结点内容

ne[N]:该结点指向的下一结点

idx:数组的当前位置,即第idx+1个插入的数(数组是边开边插的,下标表示插入的次序,而结点先后由ne[]决定【就是时间和位置前后的关系】)

初始化

void init()
{
    head = -1;
    idx = 0;
}

head设置为1:表示最后一个数的next是1,用作判断遍历是否结束。

如有疑惑,咱接着往下看。

插入头结点

看图,可以分为第一次插入和之后插入的。

总体四步走,先将数x放入节点数组,下标是idx;然后该节点的next指向原先的head节点,这样就把两个节点连起来了;下一步设置新的头结点,即将idx赋给head;为了下一次插入数字,idx指针++,开辟新的空间。

第一个插入的数字e[0]=x; ne[0]=-1;-1可以看做一个数,也可以看做一个节点,当看做节点时,可以进行其他数字的插入。

void insertH(int x)
{
	e[idx]=x;
	ne[idx]=head;
	head=idx++;
}

 在第k个节点后插入一数

 和前面的差不多,把head改成ne[k]就行

void insertK(int k,int x)
{
	e[idx]=x;
	ne[idx]=ne[k];
	ne[k]=idx++;
	
}

 删除第k数的后面一数

直接忽略该数,把第k个数接到后面的数的后面的数就行了。(图里写错了,不一定是k+1个数,因为第k+1个插入的数不一定在k数后面)

 套娃行为:

void deleteK(int k)
{
	ne[k]=ne[ne[k]];
}

遍历

for(int i=head;i!=-1;i=ne[i])

 全部代码~将将~

需要注意一下,链表比较绕,不过用数组表示的话可以避免很多野指针的问题~

//单链表模板题
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#define N 100000
using namespace std;
int head, e[N],ne[N],idx,m,k,x;
char order;
// 初始化
void init()
{
    head = -1;
    idx = 0;
}
void insertH(int x)
{
	e[idx]=x;
	ne[idx]=head;
	head=idx++;
}
void deleteK(int k)
{
	ne[k]=ne[ne[k]];
}
void insertK(int k,int x)
{
	e[idx]=x;
	ne[idx]=ne[k];
	ne[k]=idx++;
	
}
int main()
{
	cin>>m;
	init();
	for(int i=0;i<m;i++)
	{
		cin>>order;
		if(order=='H')
		{
			cin>>x;
			insertH(x);
		}
		else if(order=='D')
		{
			cin>>k;
			if(!k)head=ne[head];
			deleteK(k-1);
		}
		else if(order=='I')
		{
			cin>>k>>x;
			insertK(k-1,x);
		}
	}
	for(int i=head;i!=-1;i=ne[i])
		cout<<e[i]<<" ";
	return 0;
}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值