static final int N =100010;
static int head,idx; head是头节点,准确说是指向头节点的一个指针 idx 意思是当前操作到哪个元素了
static int[] ne=new int[N]; ne数组是指向代表下一个节点的下标
static int[] e = new int[N]; e数组是当前元素的具体的值
1.链表的输出
for (int i = head; i !=-1; i=ne[i]) {
System.out.print(e[i]+" ");
}
}
2.链表的初始化
public static void init(){ // 初始化
head = -1;
idx=0;
}
3.链表的插入
public static void insert(int k,int x){//在位置 k 后插入 x
e[idx] = x;
ne[idx] = ne[k];
ne[k] = idx;
idx++;
}
4.在头节点插入一个点
public static void add_head(int x){ //在头节点插入元素x
e[idx]=x;
ne[idx]=head;
head = idx;
idx++;
}
4.链表的删除
public static void delete(int x){ //删除x位置后的点 x+1这个点会没掉
ne[x] = ne[ne[x]];//删除一个点 idx 不用 ++
}
}
最开始的时候,链表的头节点要指向-1,
为的就是在后面进行不断操作后仍然可以知道链表是在什么时候结束
插句题外话,我个人认为head其实就是一个指针,是一个特殊的指针罢了。
刚开始的时候它负责指向空结点,在链表里有元素的时候,它变成了一个指向第一个元素的指针
当它在初始化的时候指向-1,来表示链表离没有内容。
idx = 0;//idx在我看来扮演两个角色,第一个是在一开始的时候,作为链表的下标,让我们好找
第二在链表进行各种插入,删除等操作的时候,作为一个临时的辅助性的所要操作的元素的下
标来帮助操作。并且是在每一次插入操作的时候,给插入元素一个下标,给他一个窝,感动!
再次插句话,虽然我们在进行各种操作的时候,元素所在的下标看上去很乱,但是当我们访问的
时候,是靠着指针,也就是靠ne[]来访问的,这样下标乱,也就我们要做的事不相关了。
另外,我们遍历链表的时候也是这样,靠的是ne[]
为了将这个过程更好的理解,现在
将指针转变的这个过程用比喻描述一下,牛顿老师为了省事,想插个队,队里有两个熟人
张三和李四,所以,他想插到两个人中间,但是三个人平时关系太好了,只要在一起,就
要让后面的人的手插到前面的人的屁兜里。如果前面的人屁兜里没有基佬的手,将浑身不
适。所以,必须保证前面的人屁兜里有一只手。(张三在前,李四在后)
这个时候,牛顿大步向前,将自己的手轻轻的放入张三的屁兜里,(这是第一步)
然后,将李四放在张三屁兜里的手抽出来放到自己屁兜里。(这是第二步)
经过这一顿骚操作,三个人都同时感觉到了来自灵魂的战栗,打了个哆嗦。
来源:
个人学习分享使用 , 无商业转载
作者:大海呀大海
链接:https://www.acwing.com/solution/content/16251/
来源:AcWing