文章

29

粉丝

0

获赞

0

访问

1.1k

头像
2009年计算机学科专业基础综合试题 - 第42题回答
数据结构
发布于2025年9月27日 16:39
阅读数 36

(1)算法思想:利用快慢指针,让快指针`fast`先向前`k`步,然后快慢指针一起向前,最后慢指针指向的就是倒数第`k`个节点

(2)实现步骤:设置快指针fast和慢指针slow。首先让fast先前进k步,然后再让快慢指针一起前进,知道fast为空节点。

(3)代码:

int ReseverK(node* list, int k){
    node* fast = list;
    node* slow = list;
    for(int i = 0;i<k;i++){
        if(fast->link){
            return 0;//提前遇到空节点直接返回0
        }
        fast = fast->link;
    }
    while(fast->link){//最后得到的慢指针对应的节点就是倒数第k个节点
        slow = slow->link;
        fast = fast->link;
    }
    return slow->data;
}

 


评分及理由

(1)得分及理由(满分5分)

得分:5分

理由:学生的算法思想描述清晰准确,使用了快慢指针的方法,通过一趟扫描即可找到倒数第k个节点,与标准答案的思路一致且效率相同。思想描述完整,符合题目要求。

(2)得分及理由(满分5分)

得分:3分

理由:实现步骤描述基本正确,但存在不完整之处。步骤中提到了让fast先前进k步,然后快慢指针一起前进直到fast为空节点,但没有明确说明当fast到达链表末尾时slow所指的位置就是倒数第k个节点。相比标准答案的步骤描述不够详细。

(3)得分及理由(满分5分)

得分:2分

理由:代码实现存在多处逻辑错误:
1. 函数名与题目要求不符(应为Search_k而不是ReseverK)
2. 链表结点类型定义不明确(使用了node*而不是标准的结构定义)
3. 在fast前进k步的循环中,判断条件错误:应该是if(!fast->link)而不是if(fast->link)
4. 主循环条件错误:应该是while(fast)而不是while(fast->link)
5. ...

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发