数组实现链表(AcWing)

简介: 数组实现链表(AcWing)

e[0]=1 e[1]=2 e[2]=3 e[3]=4 e[4]=5 e[5]=6

ne[0]=1 ne[1]=2 ne[2]=3 ne[3]=4 ne[4]=5 ne[5]=-1

用ne来存储e的下一个下标

初始化

我们规定,将-1设置为空节点

1. void init()
2. {
3.  head = -1;
4.  idx = 0;
5. }

头插

首先将新的节点开辟出来

e[idx]=x;

然后让改节点的下一个节点指向现在的第一个节点(head)

ne[idx]=head;

然后断开head与原来第一个节点的连接,head指向插入的这个节点,最后idx++;

1. head = idx;
2. idx++;

因此头插的代码为:

1. void add_to_head(int x)
2. {
3.  e[idx] = x;
4.  ne[idx] = head;
5.  head = idx;
6.  idx++;
7. }

在下标为k的元素后面插入x

 

1. void add(int k, int x)
2. {
3.  e[idx] = x;
4.  ne[idx] = ne[k];
5.  ne[k] = idx;
6.  idx++;
7. }

删除

 

1. void move(int k)
2. {
3.  ne[k] = ne[ne[k]];
4. }

题目:

AC代码:

1. #include<iostream>
2. using namespace std;
3. const int N = 100010;
4. int head, e[N], ne[N], idx;
5. 
6. void init()
7. {
8.  head = -1;
9.  idx = 0;
10. }
11. 
12. void add_to_head(int x)
13. {
14.   e[idx] = x;
15.   ne[idx] = head;
16.   head = idx;
17.   idx++;
18. }
19. //在下标为k的元素后面插入x
20. void add(int k, int x)
21. {
22.   e[idx] = x;
23.   ne[idx] = ne[k];
24.   ne[k] = idx;
25.   idx++;
26. }
27. //将下标为k的点后面的点删除掉
28. void move(int k)
29. {
30.   ne[k] = ne[ne[k]];
31. }
32. 
33. int main(void)
34. {
35.   int m;
36.   cin >> m;
37.   init();
38.   while (m--)
39.   {
40.     int k, x;
41.     char op;
42.     cin >> op;
43.     if (op == 'H')
44.     {
45.       cin >> x;
46.       add_to_head(x);
47.     }
48.     else if (op == 'D')
49.     {
50.       cin >> k;
51.       if (k == 0)
52.       {
53.         head = ne[head];
54.       }
55.       move(k - 1);
56.     }
57.     else
58.     {
59.       cin >> k >> x;
60.       add(k - 1, x);
61.     }
62.   }
63.   for (int i = head; i != -1; i = ne[i])
64.   {
65.     cout << e[i] << ' ';
66.   }
67.   return 0;
68. }


目录
相关文章
环形数组链表(java)
环形数组链表(java)
157 0
|
存储 算法 搜索推荐
探索常见数据结构:数组、链表、栈、队列、树和图
探索常见数据结构:数组、链表、栈、队列、树和图
769 64
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
578 5
|
存储
一篇文章了解区分指针数组,数组指针,函数指针,链表。
一篇文章了解区分指针数组,数组指针,函数指针,链表。
484 0
|
存储
数组与链表有什么区别
数组与链表有什么区别
875 1
|
存储 开发者 C#
WPF与邮件发送:教你如何在Windows Presentation Foundation应用中无缝集成电子邮件功能——从界面设计到代码实现,全面解析邮件发送的每一个细节密武器!
【8月更文挑战第31天】本文探讨了如何在Windows Presentation Foundation(WPF)应用中集成电子邮件发送功能,详细介绍了从创建WPF项目到设计用户界面的全过程,并通过具体示例代码展示了如何使用`System.Net.Mail`命名空间中的`SmtpClient`和`MailMessage`类来实现邮件发送逻辑。文章还强调了安全性和错误处理的重要性,提供了实用的异常捕获代码片段,旨在帮助WPF开发者更好地掌握邮件发送技术,提升应用程序的功能性与用户体验。
464 0
|
存储 Java 开发者
揭秘!HashMap底层结构大起底:从数组到链表,再到红黑树,Java性能优化的秘密武器!
【8月更文挑战第24天】HashMap是Java集合框架中的核心组件,以其高效的键值对存储和快速访问能力广受开发者欢迎。在JDK 1.8及以后版本中,HashMap采用了数组+链表+红黑树的混合结构,实现了高性能的同时解决了哈希冲突问题。数组作为基石确保了快速定位;链表则用于处理哈希冲突;而当链表长度达到一定阈值时,通过转换为红黑树进一步提升性能。此外,HashMap还具备动态扩容机制,当负载因子超过预设值时自动扩大容量并重新哈希,确保整体性能。通过对HashMap底层结构的深入了解,我们可以更好地利用其优势解决实际开发中的问题。
587 0
|
存储 Java 程序员
"揭秘HashMap底层实现:从数组到链表,再到红黑树,掌握高效数据结构的秘密武器!"
【8月更文挑战第21天】HashMap是Java中重要的数据结构,采用数组+链表/红黑树实现,确保高效查询与更新。构造方法初始化数组,默认容量16,负载因子0.75触发扩容。`put`操作通过计算`hashCode`定位元素,利用链表或红黑树处理冲突。`get`和`remove`操作类似地定位并返回或移除元素。JDK 1.8优化了链表转红黑树机制,提升性能。理解这些原理能帮助我们更高效地应用HashMap。
336 0
|
存储 算法 Java
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
359 0
|
存储 算法 Java
数组与链表
数组与链表