深耕专业教研,探索前沿技术
信息技术来源:镇海中学2026年5月高三高考模拟考试

第 11 题

答案与解析

本题解析

参考答案

B

程序分析

head = 0
s = [["A", 1], ["B", 2], ["C", 3], ["D", 4], ["E", 5], ["F", -1]]
n = int(input()); p1 = p2 = head
for i in range(n):
    p2 = s[p2][1]

题干说明 s 表示链表。每项的第 0 个元素保存字母,第 1 个元素保存后继结点的下标,−1 表示没有后继;head=0 是头指针,指向首结点 A,链表顺序为 A→B→C→D→E→F。p1、p2 都从首结点出发,for 循环只让 p2 沿后继链接前进 n 次,因此循环后 p2 比 p1 领先 n 条链接。

if p2 == -1:
    head = s[head][1]
else:
    while ①:
        p1 = s[p1][1]
        p2 = s[p2][1]
    ②

若 p2 为 −1,程序将头指针改为原首结点的后继,完成首结点删除。题目限定 n 小于结点总数,本题进入 else 分支。while 循环中的两条已知语句让 p1、p2 每轮各前进一个结点,二者仍相隔 n 条链接;循环结束后再执行空②。

填空分析

①

删除倒数第 n 个结点,需要找到它的前驱结点并修改前驱的链接。设链表共有 L 个结点,目标位于第 L−n+1 个,前驱位于第 L−n 个。p2 比 p1 领先 n 个位置,因此让 p2 停在第 L 个结点(尾结点)时,p1 恰好指向目标的前驱。尾结点的后继为 −1,所以只要 p2 还有后继就继续循环,填 s[p2][1] != -1。若使用 p2 != -1,会多前进一轮,使 p1 到达目标结点而不是其前驱。

②

此时 s[p1][1] 保存待删除结点的下标,s[s[p1][1]][1] 保存待删除结点的后继下标。要让前驱直接连到目标的后继,应填 s[p1][1] = s[s[p1][1]][1]。这会跳过目标结点,无须删除列表 s 中的存储项。当 n=1 时,目标为尾结点,其后继是 −1,同一语句会将前驱设为新的尾结点。两空对应选项 B。