文章
34
粉丝
78
获赞
0
访问
1.1k

评分及理由
(1)得分及理由(满分3分)
得分:1分
理由:学生的基本设计思想是使用双重循环遍历链表,每次选取一个基准结点,遍历后续结点并删除绝对值相等的结点。这个思路是正确的,能够实现题目要求的功能。但是,题目要求“时间复杂度尽可能高效”,标准答案采用了“空间换时间”的策略,使用辅助数组将时间复杂度降至O(m)。学生的算法时间复杂度为O(m²),虽然正确但不够高效,未能达到题目对“高效”的隐含要求。因此扣2分。
(2)得分及理由(满分2分)
得分:2分
理由:学生的单链表结点数据类型定义完全正确,与标准答案一致。得满分。
(3)得分及理由(满分8分)
得分:2分
理由:学生的算法描述存在多处严重逻辑错误和语法错误,导致代码无法正确运行。具体扣分点如下:
1. 函数参数 `(linklist HEAD),int n )` 括号不匹配,存在语法错误。
2. 指针类型使用混乱:`int *p = HEAD->link;` 将链表结点指针赋值给整型指针,这是类型错误。
3. 变量 `L` 被声明为 `int *` 类型,但后续 `L->link = r;` 的操作表明它应该是指向链表结点的指针。
4. 删除结点的逻辑错误:在找到重复结点 `q` 后,代码 `int r = q->link; q = q->link; L->link = r;` 试图删除 `q`,但 `L` 指针的位置并未正确更新以指向 `q` 的前驱结点,导致链表断裂。正确的做法应该是让 `q` 的前驱结点的 `link` 指向 `q` 的后继结点。
5. 内层循环结束后,`q` 和 `L` 的重新初始化逻辑 (`q = p->link; L = p;`) 放置在外层循环末尾,但此时 `p` 可能已经移动,逻辑不清晰且容易出错。
6. 代码中混用了 `null` 和 `NULL`。
由于上述错误导致算法核心功能(删除重复结点)无法正确实现,扣6分。仅因整体双重循环的删除框架思路正确,给予2分。
(4)得分及理由(满分2分)
得分:2分
理由:学生正确分析了自己算法的时间复杂度为O(n²)(应指O(m²))和空间复杂度为O(1)。这与其实现在逻辑正确情况下的分析是一致的。得满分。
题目总分:1+2+2+2=7分
登录后发布评论
暂无评论,来抢沙发