题目
链接在这里!!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;
}