ACW10 单链表:826. 单链表

The Single Linked List

Posted by qingshan on July 30, 2019

实现一个单链表,链表初始为空,支持三种操作:

向链表头插入一个数; 删除第 k 个插入的数后面的数; 在第 k 个插入的数后插入一个数。 现在要对该链表进行 M 次操作,进行完所有操作后,从头到尾输出整个链表。

注意:题目中第 k 个插入的数并不是指当前链表的第 k 个数。例如操作过程中一共插入了 n 个数,则按照插入的时间顺序,这 n 个数依次为:第 1 个插入的数,第 2 个插入的数,…第 n 个插入的数。

输入格式 第一行包含整数 M,表示操作次数。

接下来 M 行,每行包含一个操作命令,操作命令可能为以下几种:

H x,表示向链表头插入一个数 x。 D k,表示删除第 k 个插入的数后面的数(当 k 为 0 时,表示删除头结点)。 I k x,表示在第 k 个插入的数后面插入一个数 x(此操作中 k 均大于 0)。 输出格式 共一行,将整个链表从头到尾输出。

数据范围 1≤M≤100000 所有操作保证合法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
输入样例:
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
输出样例:
6 4 6 5

解答

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
N = 100010

class LinkList(object):
    def __init__(self):
        self.head = -1     # head表示头节点的开始索引,当head为-1时,链表为空
        self.e = [0] * N   # 存放每个链表节点的值
        self.ne = [0] * N  # 存放每个链表节点指向下一个节点的指针值
        self.idx = 1       # idx表示正在用链表中的那一个节点    

    def addToHead(self, x):  # 将x添加到头节点
        self.e[self.idx] = x
        self.ne[self.idx] = self.head
        self.head = self.idx
        self.idx+=1


    def remove(self, k):     # 删除第k个输入的数后面的数
        if k == 0: # 当k为0时,表示删除头结点
            self.head = self.ne[self.head]
            return
        self.ne[k] = self.ne[self.ne[k]]  # ne[k] 指向ne[k]的下个节点

    def insert(self, k, x):   # 在第k个输入的数后面插入一个数x
        self.e[self.idx] = x
        self.ne[self.idx] = self.ne[k]
        self.ne[k] = self.idx
        self.idx+=1

def main():
    l = LinkList()
    m = int(input())
    for _ in range(m):
        s, *p = input().split()
        if s == "I":
            k, x = map(int, p)
            l.insert(k, x)
        elif s == "H":
            x = int(p[0])
            l.addToHead(x)
        else:
            k = int(p[0])
            l.remove(k)

    tail = l.head  # 从头节点开始遍历整个链表并输出每个节点的值
    while tail != -1:
        print(l.e[tail], end=" ")
        tail = l.ne[tail]


if __name__ == "__main__":
    main()