单链表
本质上:静态链表(数组模拟链表)
写法1
C语言 代码
#include<stdio.h>
#include<stdlib.h>
#define N 100010
int e[N], ne[N], head, idx;
void init(){
head = -1; // -1表示null
idx = 0; // 从[0]位置开始
}
void add_to_head(int x) { e[idx] = x, ne[idx] = head, head = idx ++; }
void add(int k, int x){ e[idx] = x, ne[idx] = ne[k], ne[k] = idx ++; }
void m_remove(int k) { ne[k] = ne[ne[k]]; }
int main()
{
int n;
scanf("%d\n", &n); // 一定要写"%d\n",否则会影响到scanf("%c")
init(); // 初始化静态链表
while(n --)
{
int x, k;
char op;
scanf("%c", &op);
switch(op)
{
case 'H':
scanf("%d\n", &x);
add_to_head(x);
break;
case 'I':
scanf("%d%d\n", &k, &x);
add(k - 1, x);
break;
case 'D':
scanf("%d\n", &k);
if(!k) head = ne[head];
else m_remove(k - 1);
break;
default: break;
}
}
for(int i = head; i != -1; i = ne[i])
printf("%d ", e[i]);
return 0;
}
写法2
C++ 代码
#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int ne[N], e[N], idx;
// 初始化.默认以[0]为head指针(无实际值). 从[1] 开始存第1个结点
void init() {
ne[0] = -1, idx = 1;
}
// 在第[k]个位的右边,插入新元素
void add(int k, int x) {
e[idx] = x, ne[idx] = ne[k], ne[k] = idx ++;
}
// 删除第[k]位的右边的元素
void remove(int k){
ne[k] = ne[ne[k]];
}
int main(){
int m;
scanf("%d", &m);
init(); // 一般情况下,init()的方法体可以直接写在main函数里
while(m --){
string op;
cin >> op;
int k, x; // 在第k个位置,k对应的下标从1,2,3,....,n ; 由于[0]已被head使用,所以不需要k-1
if(op == "H"){
cin >> x;
add(0, x); // [0]的右边即实际第1个结点
}
else if(op == "I"){
cin >> k >> x;
add(k, x);
}
else {
cin >> k;
remove(k);
}
}
for(int i = ne[0]; i != -1; i = ne[i]) // ne[0] 是第1个实际有值的结点
printf("%d ", e[i]);
return 0;
}
if(!k) head = ne[head];这个是干嘛的
牛逼,更简洁了
请问一下void add_to_head(int x) { e[idx] = x, ne[idx] = head, head = idx ; }
这个函数里的head=idx怎么理解啊 头指针不应该一直指向第一个结点吗 而且这里为什么中间都是逗号而不是分号啊 我想了好久
抱歉,太久没上线了。还是回复一下,
1. 逗号隔开可以在同一行写(语法问题),就比如
int a = 10, b = 20;
也是逗号隔开2. head=idx怎么理解:这个
add_to_head
是将x
插到头指针的位置,所以头指针就要指向x
,而x
的对应的映射下标是此时内部维护的idx
, 所以head=idx。对对对,我和你写的差不多,有个小地方不一样,没改。题主写的是对的
ok~
你这个C++的也不对啊
具体哪里不对了?
感谢,你的代码,更加简洁!
感谢!注意事项的知识解决了我的bug!
加油hh