信息技术来源:Z20+名校联盟2026届高三第三次学情诊断
第 12 题
答案与解析
本题解析
参考答案
A
程序分析
d=[['D',5],['B',6],['A',4],['C',0],['B',3],['D',1],['E',-1]]
t=h=2
p=d[h][1]
while p!=-1:
...d 的每项由字符和一个下标组成,p 从 d[h][1] 取得下一个结点下标,并以 -1 为结束标记,可据此按链表理解:第 0 项是数据,第 1 项是后继指针,h=2 是头指针。初始链接为 2(A)→4(B)→3(C)→0(D)→5(D)→1(B)→6(E)→-1,括号前是结点下标,括号内是字符。t 初值为 2,p 初值为 4,外层循环从结点 4 开始处理。
d[t][1]=p ; k=p
q=d[p][1]每轮先把 t 所指结点的后继设为 p,使它连接到当前处理结点。k 从 p 开始,q 从 p 的后继开始,准备检查后面的结点。
while q!=-1:
if d[p][0]!=d[q][0]:
d[k][1]=q
k=q
else:
d[t][1]=d[p][1]
q=d[q][1]q 沿后继指针向后扫描。若 q 的字符与 p 不同,就把 q 接到 k 后面,再令 k 移到 q;这样 k 记录本轮已经接入的最后一个结点。若字符相同,k 不移动,后续接入不同字符的结点时便会越过这个重复结点;同时修改 t 的后继,使它越过 p。这里使用的是当前的 d[p][1],它可能已在前面的重新连接中改变。
if d[t][1]==p:
t=p
p=d[p][1]扫描结束后,若 t 的后继仍是 p,说明本轮没有把 p 从 t 后面跳过,便将 t 移到 p;否则 t 保持不变。因此,t 用于记录已处理部分的最后一个保留结点,供下一轮重新连接。随后 p 沿本轮更新后的后继继续前进。
按上述链接变化,只跟踪影响 d[3][1] 的过程:
| 本轮 p | 关键变化 | 本轮结束后的 t、p | d[3][1] |
|---|---|---|---|
| 4(B) | 扫描到 1(B) 时发现重复,令 d[2][1]=3;随后接入 6(E),令 d[5][1]=6,跳过结点 1 | t=2,p=3 | 0 |
| 3(C) | 后续的 D、D、E 均与 C 不同,结点 3 保留 | t=3,p=0 | 0 |
| 0(D) | q=5 时发现另一个 D,先令 d[3][1]=d[0][1]=5;q=6 时字符不同,再令 d[0][1]=6 | t=3,p=6 | 5 |
| 6(E) | 本轮开头执行 d[t][1]=p,即 d[3][1]=6;E 没有后继,内层循环不执行 | t=6,p=-1 | 6 |
此时外层循环结束,最终有效链接为 2(A)→3(C)→6(E)→-1,所以 d[3][1] 的最终值是 6。
问题反馈
解析有疑问或显示异常?请先复制题目信息,再打开反馈表单填写。
题目编号:2026_05_G3_Z20_q012
