基于数组实现单链表
邻接表:由n个链表组成,常用与树、图结构的存储
e[n] # 点n的值是多少
ne[n] # 点n指向的下一个节点
# 假设有链表如下
# 1 -> 2 -> 4
# 使用数组存储则为
e[0] = 1
ne[0] = 1
e[1] = 2
ne[1] = 2
e[2] = 4
ne[2] = -1 # -1代表该点指向的点为空
单链表实现
Python
n = 100000
head = -1 # 记录头节点
idx = 0 # 当前可使用点的下标(指针)
# 将x插入到头节点前面
def add_to_head(x):
global idx
global head
e[idx] = x
ne[idx] = head
head = idx
idx += 1
# 将x插入到下标为k的点的后面
def add(k, x):
global idx
e[idx] = x
ne[idx] = ne[k]
ne[k] = idx
idx += 1
# 将下标为k的点的后面第一个点移除
def remove(k):
ne[k] = ne[ne[k]]
if __name__ == '__main__':
e = [0] * n # 初始化值数组
ne = [-1] * n # 初始化指针数组
m = int(input())
for _ in range(m):
k = x = 0
t = input()
# 将x插入到头节点
if t[0] == "H":
x = int(t.split(" ")[-1])
add_to_head(x)
elif t[0] == "D": # 移除第k个点,下标为k-1
k = int(t.split(" ")[-1])
if k == 0: # 移除头节点
head = ne[head]
continue
remove(k - 1)
else:
k, x = [int(x) for x in t.split(" ")[1:]]
add(k - 1, x)
i = head
while i != -1:
print(e[i])
i = ne[i]
"""
IN:
10
H 9
I 1 1
D 1
D 0
H 6
I 3 6
I 4 5
I 4 5
I 3 4
D 6
OUT:
6
4
6
5
"""
Go
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
const N = 100010
var (
head = -1 // 记录头节点位置
idx = 0 // 当前可使用点的下标(指针)
e = make([]int, N, N) // 值数组,初始化默认值为0
ne = make([]int, N, N) // 指针数组
)
func init() {
// 数组元素初始化为-1, -1表示该点的指向的下一个节点为空
for i := 0; i < N; i++ {
ne[i] = -1
}
}
// addToHead 将x插入到头节点
func addToHead(x int) {
// 将x写入当前可用节点a
e[idx] = x
// 将当前节点a指向头节点,使节点a作为头节点
ne[idx] = head
// 记录头节点位置
head = idx
// 选择下一个可用节点
idx++
}
// 将x插入到下标为k的点的后面
func add(k, x int) {
// 将x的值写入当前可用的点a
e[idx] = x
// 使节点a指向节点k的下一节点
ne[idx] = ne[k]
// 使节点k的下一个节点指向节点a
ne[k] = idx
idx++
}
// 将下标为k的点的后面第一个元素移除
func remove(k int) {
ne[k] = ne[ne[k]]
}
func ReadLine(reader *bufio.Reader) string {
line, _ := reader.ReadString('\n')
return strings.TrimRight(line, "\n")
}
func ReadInt(reader *bufio.Reader) int {
num, _ := strconv.Atoi(ReadLine(reader))
return num
}
func ReadArray(reader *bufio.Reader) []int {
line := ReadLine(reader)
strs := strings.Split(line, " ")
nums := make([]int, len(strs))
for i, s := range strs {
nums[i], _ = strconv.Atoi(s)
}
return nums
}
func main() {
reader := bufio.NewReader(os.Stdin)
var m = ReadInt(reader)
for i := 0; i < m; i++ {
var (
k int
x int
)
var t = strings.Split(ReadLine(reader), " ")
// 将x插入到头节点
if t[0] == "H" {
x, _ = strconv.Atoi(t[1])
addToHead(x)
} else if t[0] == "D" { // 移除第K个节点
k, _ = strconv.Atoi(t[1])
if k == 0 { // 移除头节点
head = ne[head]
continue
}
// remove 使移除下标为idx的下一个元素
remove(k - 1)
} else {
k, _ = strconv.Atoi(t[1])
x, _ = strconv.Atoi(t[2])
add(k-1, x)
}
}
var i = head
for i != -1 {
fmt.Println(e[i])
i = ne[i]
}
}
//IN:
//10
//H 9
//I 1 1
//D 1
//D 0
//H 6
//I 3 6
//I 4 5
//I 4 5
//I 3 4
//D 6
//OUT:
//6
//4
//6
//5
最后更新于
这有帮助吗?