深耕专业教研,探索前沿技术
信息技术来源:浙江强基联盟2026年5月高三联考

第 12 题

答案与解析

本题解析

参考答案

B

程序分析

p=head=0
max_n=n=1
max_s=s=a[head][0]

题干说明列表 a 模拟链表,每个结点包含数据域和指针域。a[p][0] 是当前结点的数据,a[p][1] 是其后继结点的下标,-1 表示没有后继。head 保存首结点下标,p 从 head 出发。初始化时,n、max_n 都为1,s、max_s 都取首结点的数据,统计从只含首结点的情况开始。

while a[p][1]!=-1:
    q=a[p][1]
    if a[p][0]<a[q][0]:
        n+=1
        (1)
        if n>max_n:
            max_n=n; max_s=s
    else:
        n=1
        (2)
    (3)

循环在当前结点存在后继时进行,q 取得后继结点下标,因此 a[p][0] 与 a[q][0] 比较的是链表中相邻两个结点的数据。前者小于后者时,n 加1;否则 n 重置为1。由此可知,n 统计当前连续递增段的结点数,遇到不递增的相邻结点就重新计数。n>max_n 时,程序同时保存 n 和 s;结合题目要求,max_n 保存已找到的最长长度,s 需要与当前递增段的数据和保持一致,max_s 才能保存对应最长段的数据和。“最长”依据结点数判断,不是依据数据和的大小判断。

填空分析

(1)

此处位于递增分支中,n 已加1,表示后继结点 q 加入当前递增段。为使 s 与这一段对应,应在原有数据和上加上新加入结点的数据 a[q][0],填 s+=a[q][0],即代码④。

(2)

相邻数据不满足递增关系时,原递增段结束,n=1 表示以结点 q 为起点重新统计。新段当前只有 q 一个结点,因此应把 s 重置为 a[q][0],填 s=a[q][0],即代码③;若仍累加,就会把前一段的数据也计入新段。

(3)

本轮已经处理当前结点 p 与其后继 q,下一轮应从 q 继续向后比较,因此填 p=q,即代码①。由于本轮 q=a[p][1],代码②也能实现同样的后移,但给定选项中只有 B 同时满足前两空为④、③及第三空后移的要求。