引言
主要讲解在 oj 的面试背景下,如何处理数据结构。
文章目录
2. 双链表
3. 栈与队列(先入后入与先入先出)
4. 单调栈,单调队列
5. trie 字典树
6. 并查集
7. 堆
1. 单链表——数组模拟单链表
因为动态链表比较复杂,每次需要重建的时间成本比较大。因此在题目中一般采用数组模拟静态链表的操作。
定义:e[index]
表示编号为index的节点的数值,ne[index]
表示编号为index的节点的子节点,每次最后还需要index++
表示生成新的数组位置。
e = [0]*100000
ne = [0]*100000
index = 0
head = -1
N = int(input())
def add_to_head(x): # 头插链表,链表的尾部是-1
# 注意设置全局变量
global e, index, head, ne
e[index] = x
ne[index] = head
head = index
index += 1
def insert(k, x): # 插入到第k个后面
global e, index,ne
e[index] = x
ne[index] = ne[k]
ne[k] = index
index += 1
def delete(k): # 删除第K个插入的数后面的数
global ne
ne[k] = ne[ne[k]]
for i in range(N):
# 注意这里的读入方法
s, *p = input().split()
if s == 'H':
# int这个函数只能操作字符型
add_to_head(int(p[0]))
elif s == 'I':
k, x = map(int, p)
insert(k-1, x)
elif s == 'D':
k = int(p[0])
if k == 0:
head = ne[head]
else:
delete(k-1)
while head != -1:
print(e[head], end=' ')
head = ne[head]
2. 双向链表
N = int(input())
e = [0]*100000
r = [0]*100000
l = [0]*10000